MySQL-更新表并将列值设置为当前行值减去上一行值的差值
我有一个包含20列的表,我想用此行(此列)的值减去同一列上一行的值之差填充每行的最后一列。。(如果当前行上的时间高于上一行上的时间) 包含值和时间的列是varchar(10) 我得到一个MySQL错误MySQL-更新表并将列值设置为当前行值减去上一行值的差值,mysql,set,Mysql,Set,我有一个包含20列的表,我想用此行(此列)的值减去同一列上一行的值之差填充每行的最后一列。。(如果当前行上的时间高于上一行上的时间) 包含值和时间的列是varchar(10) 我得到一个MySQL错误 ERROR 1093 (HY000): You can't specify target table 'tbl' for update in FROM clause 我知道出现此错误是正常的,因为我试图在从表中进行选择时更新表 有没有办法避免出现这个错误,并用当前行减去前一行的差值来更新表中的值
ERROR 1093 (HY000): You can't specify target table 'tbl' for update in FROM clause
我知道出现此错误是正常的,因为我试图在从表中进行选择时更新表
有没有办法避免出现这个错误,并用当前行减去前一行的差值来更新表中的值
非常感谢
编辑:
糟糕的是,我忘了提到我还有一个日期列,以及每行的唯一ID…这有点复杂。在
select
查询中,您可以使用变量或执行以下操作来获取上一个值
select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl;
注意:MySQL不包含行顺序的固有概念。没有ORDERBY子句的SELECT查询可以任意顺序返回结果集中的行。因此,如果要将“上一行”标识为任何行,则需要从排序开始。如果你使用“默认顺序”,无论发生什么,当你的桌子变大时,你都会感到抱歉。嗨,戈登,谢谢你的回答。我忘了提到每一行都有一个日期和一个唯一的ID,所以这一行可以有相同的时间,但它们将有不同的日期。。也许这可以帮助你解决你的问题,很抱歉在我的第一篇文章中没有提到。
select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl;
update tbl t join
(select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl
) tt
on tt.time = t.time
set t.diff = t.col - tt.prev_col;