2015年8月2日日曜日

[MySQL] ORDER BY FIELD (col_name, val1, val2) 知らなかった・・・

長年MySQL使ってきたけれど、ORDER BY FIELD (col_name, val1, val2) 知らなかったのですぅ。
まぁ、知らなくても普通にやってこれたけど、最近railsを使っている影響のせいもあってか知ることになった。

railsやっていると先にpluckでidだけ取ってきて配列を加工してその後にデータを取ってくるということあったりする。多分。で、そのときに配列の順番そのままにデータ取りたいなーなんてときもあるけど、そのままfindすると、
mysql> SELECT * FROM students WHERE id IN (4, 5, 2);
+----+--------------+-----------------------------------+
| id | name         | skill                             |
+----+--------------+-----------------------------------+
|  2 | 友利奈緒     | 自分の姿を視界から消す            |
|  4 | 西森柚咲     | 口寄せ                            |
|  5 | 黒羽美砂     | 発火能力                          |
+----+--------------+-----------------------------------+
順番は保持されないので、アプリケーション側でなんとかしないとけないのかーって思ってたら、order by fieldなんてのがあるのね。
mysql> SELECT * FROM students WHERE id IN (4, 5, 2) ORDER BY FIELD (id, 4, 5, 2);
+----+--------------+-----------------------------------+
| id | name         | skill                             |
+----+--------------+-----------------------------------+
|  4 | 西森柚咲     | 口寄せ                            |
|  5 | 黒羽美砂     | 発火能力                          |
|  2 | 友利奈緒     | 自分の姿を視界から消す            |
+----+--------------+-----------------------------------+
ちょっと便利なのでござる。


ちなみに、指定してないものがあるとこんな感じで指定した順番に関してはその通りにはなる。
mysql> SELECT * FROM students ORDER BY FIELD (id, 4, 5, 2);
+----+-----------------------+--------------------------------------+
| id | name                  | skill                                |
+----+-----------------------+--------------------------------------+
|  1 | 乙坂有宇              | 任意の対象の体を乗っ取る             |
|  3 | 高城丈士朗            | 瞬間移動(高速移動)                   |
|  6 | 福山有史              | 念動力                               |
|  7 | スカイハイ斉藤        | 空中浮遊能力                         |
|  4 | 西森柚咲              | 口寄せ                               |
|  5 | 黒羽美砂              | 発火能力                             |
|  2 | 友利奈緒              | 自分の姿を視界から消す               |
+----+-----------------------+--------------------------------------+