読者です 読者をやめる 読者になる 読者になる

あいつの日誌β

あいつの日誌です。

MySQL: in 演算子で指定した順番でソートされた結果を求める

テストスクリプト

CREATE TABLE test_user_item (
  `id`      int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_id` int(10) unsigned NOT NULL COMMENT 'ユーザーID',
  `name` varchar(12) NOT NULL COMMENT 'アイテム名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='テスト';

INSERT INTO test_user_item (user_id, name) VALUES 
(1, 'どうのつるぎ'),
(2, 'どうのつるぎ'),
(4, 'どうのつるぎ'),
(3, 'どうのつるぎ');

SELECT * FROM test_user_item WHERE user_id IN (4,1,3,2);
SELECT * FROM test_user_item WHERE user_id IN (4,1,3,2) ORDER BY FIELD(user_id, 4, 1, 3, 2);


DROP TABLE test_user_item;

何なの?

いろいろな事情があって in 演算子で指定した順番で結果を並べたいケースがあった場合はFIELDを使うといいかもしれません。

id 順でソートされていても困らない場合

SELECT * FROM test_user_item WHERE user_id IN (4,1,3,2);
+----+---------+--------------------+
| id | user_id | name               |
+----+---------+--------------------+
|  1 |       1 | どうのつるぎ       |
|  2 |       2 | どうのつるぎ       |
|  3 |       4 | どうのつるぎ       |
|  4 |       3 | どうのつるぎ       |
+----+---------+--------------------+
4 rows in set (0.01 sec)

in演算子で指定したid順で結果を返してほしい場合

mysql> SELECT * FROM test_user_item WHERE user_id IN (4,1,3,2) ORDER BY FIELD(user_id, 4, 1, 3, 2);
+----+---------+--------------------+
| id | user_id | name               |
+----+---------+--------------------+
|  3 |       4 | どうのつるぎ       |
|  1 |       1 | どうのつるぎ       |
|  4 |       3 | どうのつるぎ       |
|  2 |       2 | どうのつるぎ       |
+----+---------+--------------------+
4 rows in set (0.00 sec)

まとめ

まあテーブル構造を検討できるんだったら先にDB設計を見直しすべきケースな気がしたそんなクエリでした。