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。これを回避する方法があります。テーブルをサブクエリに埋め込むだけです。

次の変数を使用してこれを行うこともできます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 に答える