我有一个包含id, name, position, old_position
列的表格。
列old_position
包含用于在进行选择时定义顺序的唯一数字。但这些数字不是连续的(即使订购时也是如此)。例如。
2,12,11,14,20,35,45,28,
我想要实现的是使用从1开始的连续数字填充列position
,但根据old_position使用相同的顺序,所以当我按position ASC
订购时,我仍然可以获得相同的行顺序。有没有办法做到这一点?
由于
答案 0 :(得分:2)
假设id
对于每一行都是唯一的,您可以使用变量执行此操作:
update <table> t join
(select t.id, @rn := @rn + 1 as seqnum
from <table> t cross join (select @rn := 0) vars
order by old_position
) tt
on tt.id = t.id
set t.position = tt.seqnum;
如果您愿意,可以在没有子查询的情况下编写此代码。挑战在于定义变量。这是一种方法:
update <table> t
set t.position = (@rn := coalesce(@rn, 0) + 1)
order by old_position;
您无法在子查询中初始化变量,因为MySQL在join
语句中不允许order by
和update
。