想象一下,有一个包含以下内容的表:
x y z
aa 5 null
bb 2 null
cc 5 null
dd 1 null
我希望按y
对行进行排序,并为z分配一个自动递增的字段,因此在这种情况下,最终结果(更改的表)将是
x y z
dd 1 1
bb 2 2
aa 5 3
cc 5 4
或
x y z
aa 5 3
bb 2 2
cc 5 4
dd 1 1
我该怎么做?
所以为了说清楚,我想改变表格,而不是把这些东西改为代码。
答案 0 :(得分:2)
update your_table t1
inner join
(
select id, @rank := @rank + 1 as r
from your_table, (select @rank := 0) r
order by y
) t2 on t2.y = t.y
set z = r
答案 1 :(得分:1)
这就是我所谓的“痛苦”解决方案。它使用子查询来计算每行的等级:
update t
set z = (select count(*) as cnt
from (select t.* from t) t2
where t2.y < t.y or t2.y = t.y and t2.x <= t.x
)
请注意,当您在update
和delete
中的子查询中使用目标表时,MySQL会生成错误。有一种解决方法。只需将表嵌入子查询中。
您也可以使用带join
的变量:
update t join
(select t.*, (@rank := @rank + 1) as seqnum
from t cross join (select @rank := 0) const
order by y
) t2
on t.x = t2.x
set t.z = t2.seqnum;
子查询使用order by
计算序列号。外部update
然后将值分配给适当的行。这假定x
唯一标识每一行。