Mysql - 根据顺序从另一列更新 table 列

Mysql - update table column from another column based on order

我有一个包含 id, name, position, old_position 列的 table。

old_position 包含唯一编号,用于在制作 select 时定义顺序。但是数字不是连续的(即使订购时也是如此)。例如。 2, 12, 11, 14, 20, 35, 45, 28,

我想要实现的是用从 1 开始的连续数字填充列 position,但根据 old_position 使用相同的顺序,所以当我按 position ASC 我仍然可以获得相同的行顺序。有办法吗?

谢谢

假设 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 不允许在 update 语句中同时使用 joinorder by