-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 に答える