MySQLで指定のレコードを先頭にする(任意の順にする)ORDER BYの記述方法。
やりたいこと
こんなテーブルがある。
【テーブル:job_name】
id | name |
---|---|
1 | 細工師 |
2 | 作家 |
3 | 狩人 |
4 | 漁師 |
5 | 鋳物師 |
これをid=4の「漁師」を先頭にして取得したい。
実装その1 CASE文
idが4の場合0に置き換えて、昇順で取得する。もしidが0未満のレコードがあるなら最小値を指定する。
id=4以外のレコードはid順になる。
SELECT name FROM job_name
ORDER BY CASE id WHEN 4 THEN 0 ELSE id END ASC;
実装その2 ORDER BY FIELD
FIELD
はMySQL独自の記法。
FIELDで指定したid=4が一番後ろに来る。DESC
で逆順にすれば良い。
SELECT name FROM job_name
ORDER BY FIELD(id, 4) DESC;
-- 全行指定する場合はDESCは不要
SELECT name FROM job_name
ORDER BY FIELD(id, 4, 1, 2, 3, 5);
実装その3 idを指定
指定したid=4が一番後ろに来る。DESC
で逆順にすれば良い。
SELECT name FROM job_name
ORDER BY id = 4 DESC;
あとがき
- 実装その2、その3のid:4以外の指定してしない行は順番未指定の状態なので注意。
- 「idを指定してソート」は多用すると分かりづらいので、書き方を工夫するか、場合によっては「ソート順」のカラムをテーブルに追加するのも検討したい。もしくは取得後にプログラム内で並び替えるのも良いかも。