-2

就在之前,我发布了一个关于为列中的每个重复值获取计数器的问题

现在我将扩展这个问题,例如:

+------+------+------+
| id   | data | num  | 
+------+------+------+
| 1    | a    |      | 
| 2    | a    |      |
| 3    | a    |      |
| 4    | b    |      |
| 5    | b    |      |
| 6    | c    |      |
| 7    | d    |      |
| 8    | a    |      |
| 9    | b    |      | 
+------+------+------+

可以更新为:

+------+------+------+
| id   | data | num  | 
+------+------+------+
| 1    | a    |   a1 | 
| 2    | a    |   a2 |
| 3    | a    |   a3 |
| 4    | b    |   b1 |
| 5    | b    |   b2 |
| 6    | c    |   c1 |
| 7    | d    |   d1 |
| 8    | a    |   a4 |
| 9    | b    |   b3 | 
+------+------+------+

无论如何,向蓝脚鞠躬!

4

2 回答 2

3

看起来您只想将CONCAT()这些值放在一起:

select data, group_row_number, 
  concat(data, cast(group_row_number as char)) as num,
  overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num

请参阅带有演示的 SQL Fiddle

于 2012-09-17T18:46:21.563 回答
0

解决了:

UPDATE mytable
SET num = ( SELECT num FROM 
(
select id,
  concat(data, cast(group_row_number as char)) as num
from
(
  select id, data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy
  from
  (
    select id, data
    from mytable, (SELECT @rn:=0) r
  ) x
  order by data, id
) x  order by id
) tempSort

 WHERE mytable.ID = tempSort.ID );

再次感谢@bluefeet!

于 2012-09-17T19:36:01.893 回答