MySQL:如何按字段对行进行排序并将另一个字段分配给计数器?

时间:2013-06-06 17:55:25

标签: mysql

想象一下,有一个包含以下内容的表:

 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

我该怎么做?

所以为了说清楚,我想改变表格,而不是把这些东西改为代码。

根据要求,http://sqlfiddle.com/#!2/cd610/1

2 个答案:

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

SQLFiddle demo

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

请注意,当您在updatedelete中的子查询中使用目标表时,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唯一标识每一行。