【MySQL】IN句で指定した順序どおりに結果セットを並べ替える方法(FIND_IN_SET活用)
MySQLでは、IN句に列挙した値の順序どおりに結果セットを取得したいケースがあります。しかし、通常のORDER BYでは昇順・降順の並べ替えしか行えず、IN句の指定順をそのまま維持することはできません。
このような場合は、FIND_IN_SET()関数をORDER BYと組み合わせて使用します。この記事では、実際にテーブルを作成し、データを挿入しながら具体的な手順を解説します。
1. サンプルテーブルの作成
まず、従業員情報を格納するテーブルを作成します。
mysql> create table recordSetOrderDemo
-> (
-> EmployeeId int,
-> EmployeeName varchar(30)
-> );
Query OK, 0 rows affected (0.63 sec)
テーブルには「EmployeeId(従業員ID)」と「EmployeeName(従業員名)」の2つのカラムを定義しています。
2. テストデータの挿入
次に、INSERT文を使って複数のレコードを追加します。あえてIDの昇順にならないよう挿入している点に注目してください。
mysql> insert into recordSetOrderDemo values(20,"John");
Query OK, 1 row affected (0.20 sec)
mysql> insert into recordSetOrderDemo values(10,"Larry");
Query OK, 1 row affected (0.14 sec)
mysql> insert into recordSetOrderDemo values(100,"Mike");
Query OK, 1 row affected (0.14 sec)
mysql> insert into recordSetOrderDemo values(50,"Sam");
Query OK, 1 row affected (0.11 sec)
mysql> insert into recordSetOrderDemo values(10,"David");
Query OK, 1 row affected (0.18 sec)
3. 挿入されたデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from recordSetOrderDemo;
実行結果は以下のとおりです。
+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| 20 | John |
| 10 | Larry |
| 100 | Mike |
| 50 | Sam |
| 10 | David |
+------------+--------------+
5 rows in set (0.00 sec)
このように、テーブル内のデータは挿入された順番に格納されていますが、必ずしもこの順序で取得される保証はありません。
4. IN句の指定順で並べ替えるクエリ
ここで本題です。EmployeeIdが「100, 10, 20, 50」の順で結果を取得したい場合、以下のようにORDER BY FIND_IN_SET()を使用します。
mysql> select *from recordSetOrderDemo where EmployeeId IN(100,10,20,50)
-> ORDER BY FIND_IN_SET(EmployeeId,'100,10,20,50');
クエリのポイント
- FIND_IN_SET(検索値, 文字列リスト):第1引数の値が、カンマ区切りの第2引数リストの中で何番目に位置するかを返します。
ORDER BYでこの位置情報を基準にソートすることで、IN句に記述した順序どおりの結果が得られます。
実行結果は以下のとおりです。
+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| 100 | Mike |
| 10 | Larry |
| 10 | David |
| 20 | John |
| 50 | Sam |
+------------+--------------+
5 rows in set (0.03 sec)
ID「100 → 10 → 10 → 20 → 50」の順に、IN句で指定した通りの並びでレコードが返されていることが確認できます。同じID(10)が複数存在する場合も、両方とも該当する位置にまとめて出力されます。
まとめ
- IN句の指定順に結果を並べ替えるには、
ORDER BY FIND_IN_SET(カラム名, '値1,値2,...')を使用する。 FIND_IN_SET()は、値がリスト内の何番目にあるかを数値で返すため、それをソートキーとして利用できる。- 優先順位をつけてデータを表示したい場合(例:おすすめ商品やピン留め記事など)に非常に便利なテクニック。
-
MySQLで一連の数値の最初の数値を基準に並べ替えるクエリの書き方
概要カンマ区切りで格納された一連の数値(例:「245,654,76,89,98」)を、その中の最初の数値を基準にして並べ替えたい場合は、ORDER BY句とSUBSTRING_INDEX()関数、さらにCAST()関数を組み合わせることで実現できます。まずはサンプル用のテーブルを作成しましょう。mysql> create table DemoTable ( SetOfNumbers text ); Query OK, 0 rows affected (0.53 sec)続いて、insertコマンドでいくつかレコードを挿入します。mysql> insert into Demo
-
MySQLで日付レコードを並べ替え、ORDER BYとLIMITで2番目のレコードを取得する方法
MySQLでレコードを並べ替えるには ORDER BY 句を使用し、並べ替えた結果の中から特定の順位のレコードだけを取得したい場合は、LIMIT 句にオフセット(取得開始位置)を組み合わせます。ここでは、出荷日を含む顧客テーブルを例に、具体的な手順を解説します。 1. サンプルテーブルを作成する まず、顧客ID(自動採番の主キー)、顧客名、出荷日の3つのカラムを持つテーブルを作成します。 mysql> create table DemoTable1417 -> ( -> CustomerId int NOT NULL AUTO_INCREMENT PRIMAR