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
语句中同时使用 join
和 order by
。
我有一个包含 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
语句中同时使用 join
和 order by
。