5

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

 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

4

2 回答 2

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 演示

于 2013-06-06T17:59:04.217 回答
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请注意,当您在和中的子查询中使用目标表时,MySQL 会生成错误delete。有办法解决这个问题。只需将表嵌入子查询中。

您也可以使用带有 a 的变量来执行此操作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唯一标识每一行。

于 2013-06-06T18:13:31.470 回答