並び替えるためのデータを個別に持たせたとき、任意の順番で連番を振るのに少し悩んだ。
あまり効率的ではない部分があるかも(逆順で書かせてるところとか)。
SQL文
SET
@cnt_i:=0;
UPDATE
sample
SET
pos = (@cnt_i := @cnt_i + 1)
ORDER BY
FIELD(id, ...) DESC
,id;
解説
ORDER BY
FIELD(id, ...) DESC
FIELD()の第一引数に並び順を指定するカラムを指定し、
第二引数以降に、任意の順番を逆順で指定する。
FIELD(id,8,6,2) DESC
例えばidを2,6,8の順番で並び替えたい場合は、このように指定する。
ORDER BY
-- FIELD(id, ...) DESC
,id;
idが指定されていないカラムについては、idの昇順で並び替える。
例
id | pos |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
このようなsampleテーブルがあるとする。
posは並び順データを格納するカラム。
このsampleテーブルに対して以下のSQLを実行すると…
SET
@cnt_i:=0;
UPDATE
sample
SET
pos = (@cnt_i := @cnt_i + 1)
ORDER BY
FIELD(id,8,6,2) DESC
,id;
id | pos |
---|---|
2 | 1 |
6 | 2 |
8 | 3 |
1 | 4 |
3 | 5 |
4 | 6 |
5 | 7 |
7 | 8 |
9 | 9 |
このように並び順が格納される。
2→6→8と任意の順番で連番が割り振られる。
順番を指定していないカラムは、id昇順を基準として続く連番が割り振られる。