WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

MySQLのWHERE節のIN句で、指定したIDの順番でソートする

   

やりたいこと

例えばこんなテーブルを作る。

mysql> select * from items;
+----+------+
| id | name |
+----+------+
|  1 | foo  |
|  2 | bar  |
|  3 | hoge |
|  4 | piyo |
+----+------+
4 rows in set (0.00 sec)
mysql> CREATE TABLE items (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(12) NOT NULL COMMENT '名前',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='テスト用のテーブル';
mysql> INSERT INTO items (name) VALUES ('foo'), ('bar'),  ('hoge'), ('piyo');

やりたいのは、`SELECT * FROM items WHERE id IN (2, 4, 1, 3);`のようなSQLを作った時に、このIN句で指定しているIDの順でレコードを並び替える処理。
この例だとIDが2, 4, 1, 3の順でレコードをとってきたいが、IN句にこのようにしていしただけではソートはされない。

mysql> select * from items where id in (2, 4, 1, 3);
+----+------+
| id | name |
+----+------+
|  1 | foo  |
|  2 | bar  |
|  3 | hoge |
|  4 | piyo |
+----+------+
4 rows in set (0.01 sec)

対応方法

ORDER BY節のFIELD句を使って実現できる。
例えば、下記のようにSQLを発行する。

mysql> select * from items where id in (1, 2, 3, 4) ORDER BY FIELD(id, 2, 4, 1, 3);
+----+------+
| id | name |
+----+------+
|  2 | bar  |
|  4 | piyo |
|  1 | foo  |
|  3 | hoge |
+----+------+
4 rows in set (0.00 sec)

ソートされている。

 - MySQL , ,