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

MySQLのIN()句でIDを任意の順序で取得・表示する方法(FIELD関数の活用)

MySQLでIN()を使ってIDを指定した順序で表示するには?

MySQLでIN()句を使って複数のIDを取得する際、通常は結果が昇順や降順など標準的な順序で返されます。しかし、「IN()に記述した通りの順序」で結果を取得したいケースは少なくありません。
そのような場合は、FIELD()関数をORDER BY句と組み合わせることで実現できます。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable
    (
    UserId int
    );
Query OK, 0 rows affected (0.64 sec)

テストデータの挿入

次に、INSERTコマンドを使っていくつかのレコードを登録します。

mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(80);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(70);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(60);
Query OK, 1 row affected (0.13 sec)

登録データの確認

SELECTコマンドでテーブル内のレコードを確認してみます。

mysql> select *from DemoTable;

実行すると、以下のような出力が得られます。

+--------+
| UserId |
+--------+
| 100    |
| 10     |
| 40     |
| 80     |
| 70     |
| 60     |
+--------+
6 rows in set (0.00 sec)

このように、レコードは挿入された順番に表示されています。

IN()とFIELD()を組み合わせて任意の順序で並べ替える

ここからが本題です。IN()句とFIELD()関数を組み合わせることで、自分の好きな順序どおりにレコードを表示できます。

mysql> select UserId from DemoTable where UserId IN(60,100,10,80,40,70)
order by field(UserId,60,100,10,80,40,70);

このクエリを実行すると、以下の出力が得られます。

+--------+
| UserId |
+--------+
| 60     |
| 100    |
| 10     |
| 80     |
| 40     |
| 70     |
+--------+
6 rows in set (0.03 sec)

FIELD()関数の仕組み

FIELD()関数は、第1引数の値が第2引数以降のリストの中で何番目に位置するかを数値で返します。例えば FIELD(UserId, 60, 100, 10, 80, 40, 70) の場合、UserIdが「60」なら「1」、「100」なら「2」というように評価されます。
これをORDER BY句に指定することで、リストに記述した順序そのままにソートできるというわけです。

なお、FIELD()のリストに含まれない値は「0」として扱われるため、その値は先頭に表示される点にも注意してください。

  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コマンドを使ってテーブ