MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでWHERE id IN(...)の指定順どおりに結果を取得する方法(FIND_IN_SET活用)

MySQLでWHERE id IN(...)を使用すると、通常、指定した値の順序どおりには結果が返されません。IN句に記述した値の順序をそのまま維持してレコードを取得したい場合は、FIND_IN_SET()関数をORDER BY句と組み合わせて使用します。

FIND_IN_SET()を使った指定順ソートの構文

基本の構文は以下のとおりです。

SELECT * FROM yourTableName
WHERE yourColumnName IN (yourValue1, yourValue2, yourValue3, ....N)
ORDER BY FIND_IN_SET(yourColumnName, 'yourValue1,yourValue2,yourValue3,....N');

FIND_IN_SET()関数は、第2引数のカンマ区切りリストの中で第1引数の値が何番目に位置するかを返します。これをORDER BYに渡すことで、IN句で指定した順序どおりに結果を並べ替えられます。

実際に試してみよう:テーブルの作成

まず、サンプル用のテーブルを作成します。

mysql> create table FindInSetDemo
    -> (
    -> Id int,
    -> Name varchar(20),
    -> Age int
    -> );
Query OK, 0 rows affected (0.54 sec)

レコードの挿入

次に、INSERTコマンドでいくつかのレコードを挿入します。

mysql> insert into FindInSetDemo values(10,'John',23);
Query OK, 1 row affected (0.20 sec)
mysql> insert into FindInSetDemo values(1,'Carol',21);
Query OK, 1 row affected (0.17 sec)
mysql> insert into FindInSetDemo values(4,'Bob',25);
Query OK, 1 row affected (0.19 sec)
mysql> insert into FindInSetDemo values(6,'Sam',26);
Query OK, 1 row affected (0.15 sec)
mysql> insert into FindInSetDemo values(7,'Maxwell',29);
Query OK, 1 row affected (0.18 sec)
mysql> insert into FindInSetDemo values(8,'Mike',22);
Query OK, 1 row affected (0.13 sec)
mysql> insert into FindInSetDemo values(2,'David',27);
Query OK, 1 row affected (0.20 sec)
mysql> insert into FindInSetDemo values(3,'James',20);
Query OK, 1 row affected (0.20 sec)

テーブルの内容を確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from FindInSetDemo;

実行結果は以下のとおりです。

+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
|   10 | John    | 23   |
|    1 | Carol   | 21   |
|    4 | Bob     | 25   |
|    6 | Sam     | 26   |
|    7 | Maxwell | 29   |
|    8 | Mike    | 22   |
|    2 | David   | 27   |
|    3 | James   | 20   |
+------+---------+------+
8 rows in set (0.00 sec)

WHERE id IN()で指定した順序どおりに取得するクエリ

それでは、FIND_IN_SET()を使ってIdが「1, 4, 6, 7」の順序で結果を取得するクエリを実行します。

mysql> select *from FindInSetDemo
    -> where Id IN (1,4,6,7)
    -> order by FIND_IN_SET(Id, '1,4,6,7');

実行結果は以下のとおりです。

+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
|    1 | Carol   |   21 |
|    4 | Bob     |   25 |
|    6 | Sam     |   26 |
|    7 | Maxwell |   29 |
+------+---------+------+
4 rows in set (0.00 sec)

このように、IN句で指定した「1, 4, 6, 7」の順序どおりにレコードが取得できていることが確認できます。

まとめ

WHERE id IN(...)だけでは結果の順序は保証されませんが、ORDER BY FIND_IN_SET(カラム名, '値のリスト')を組み合わせることで、指定した値の順序どおりにレコードを取得できます。特定の表示順序が必要な場面(おすすめ商品の並び順や、優先度順のデータ取得など)で非常に便利なテクニックなので、ぜひ活用してみてください。

  1. 「order」というテーブル名でMySQLクエリエラーが発生する原因と解決方法

    「order」は予約語であることに注意MySQLでは「order」は予約語(ORDER BY句などで使用されるキーワード)として登録されています。そのため、予約語をそのままテーブル名として使用しようとすると、構文エラーが発生します。予約語をテーブル名やカラム名として使いたい場合は、バッククォート(`)で囲む必要があります。テーブルの作成まず、バッククォートで「order」というテーブルを作成してみましょう。mysql> create table `order` -> ( -> StudentId int -> ); Query OK, 0 row

  2. MySQLでユーザー定義変数(数値)を使ってORDER BYを実行する方法

    MySQLでは、ユーザー定義変数とPREPARE文(プリペアドステートメント)を組み合わせることで、ORDER BYの条件を動的に指定できます。この記事では、数値型のユーザー定義変数を使用してORDER BYを実行する手順を、サンプルコード付きで詳しく解説します。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable1898 ( Number int ); Query OK, 0 rows affected (0.00 sec)2. レコードの挿入続いて、INSERTコマンドを使ってテーブ