Mysql - 根据订单从另一列更新表列

时间:2015-02-07 16:26:30

标签: mysql sql-order-by

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

old_position包含用于在进行选择时定义顺序的唯一数字。但这些数字不是连续的(即使订购时也是如此)。例如。 2,12,11,14,20,35,45,28,

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

由于

1 个答案:

答案 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 byupdate