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設計を見直しすべきケースな気がしたそんなクエリでした。