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

MySQLのIN句検索結果を指定した順序どおりに表示する方法|ORDER BY FIND_IN_SET()の使い方

MySQLでIN()句を使ってレコードを抽出する場合、結果は必ずしもINリストに記述した順序どおりには返されません。抽出結果を自分が指定した値の順番どおりに並べたい場合は、ORDER BYFIND_IN_SET()を組み合わせて使用します。

まず、FIND_IN_SET()の動作を理解するために、サンプル用のテーブルを作成しましょう。テーブルを作成するクエリは以下のとおりです。

mysql> create table ProductStock
    -> (
    -> ProductId int,
    -> ProductName varchar(20),
    -> ProductQuantity int,
    -> ProductPrice float
    -> );
Query OK, 0 rows affected (0.79 sec)

テーブルへのデータ挿入

続いて、INSERTコマンドを使ってテーブルにいくつかのレコードを挿入します。クエリは以下のとおりです。

mysql> insert into ProductStock values(1,'Product-101',10,500.56);
Query OK, 1 row affected (0.20 sec)
mysql> insert into ProductStock values(25,'Product-111',5,150.00);
Query OK, 1 row affected (0.21 sec)
mysql> insert into ProductStock values(67,'Product-311',7,1000.50);
Query OK, 1 row affected (0.60 sec)
mysql> insert into ProductStock values(55,'Product-561',8,900.00);
Query OK, 1 row affected (0.24 sec)
mysql> insert into ProductStock values(75,'Product-221',15,670.56);
Query OK, 1 row affected (0.14 sec)

登録済みレコードの確認

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

mysql> select *from ProductStock;

出力結果

+-----------+-------------+-----------------+--------------+
| ProductId | ProductName | ProductQuantity | ProductPrice |
+-----------+-------------+-----------------+--------------+
|         1 | Product-101 |              10 |       500.56 |
|        25 | Product-111 |               5 |          150 |
|        67 | Product-311 |               7 |       1000.5 |
|        55 | Product-561 |               8 |          900 |
|        75 | Product-221 |              15 |       670.56 |
+-----------+-------------+-----------------+--------------+
5 rows in set (0.00 sec)

FIND_IN_SET()でINリストの順序どおりにソートする

ここからが本題です。以下のクエリでは、WHERE句のIN()で抽出しつつ、ORDER BY FIND_IN_SET()によってINリスト「25, 55, 67, 75, 1」の順序どおりに結果を並べ替えています。

mysql> select *from ProductStock
    -> where ProductId IN(25,55,67,75,1)
    -> order by find_in_set(ProductId,'25,55,67,75,1');

出力結果

+-----------+-------------+-----------------+--------------+
| ProductId | ProductName | ProductQuantity | ProductPrice |
+-----------+-------------+-----------------+--------------+
|        25 | Product-111 |               5 |          150 |
|        55 | Product-561 |               8 |          900 |
|        67 | Product-311 |               7 |       1000.5 |
|        75 | Product-221 |              15 |       670.56 |
|         1 | Product-101 |              10 |       500.56 |
+-----------+-------------+-----------------+--------------+
5 rows in set (0.31 sec)

出力結果を見ると、ProductIdがINリストで指定したとおり「25 → 55 → 67 → 75 → 1」の順に表示されていることが確認できます。FIND_IN_SET()は、第2引数に渡したカンマ区切りの文字列リストの中で、第1引数の値が何番目に位置するかを数値で返す関数です。この戻り値をORDER BYに渡すことで、昇順・降順といった通常のソートではなく、任意のカスタム順序での並べ替えが実現できます。

なお、同様の目的にはFIELD()関数を使う方法もあります。ORDER BY FIELD(ProductId, 25, 55, 67, 75, 1)のように記述すれば、数値型のカラムをそのまま扱えるため、状況に応じて使い分けるとよいでしょう。

  1. MySQLで0を末尾に回して並べ替える!条件付きSELECTとORDER BYの使い方

    MySQLでは、ORDER BY句に「カラム名=0」という条件式を組み合わせることで、0以外の値を昇順に並べたうえで、0のレコードだけを末尾にまとめて表示できます。この記事では、その具体的な書き方と実行例を分かりやすく解説します。基本構文select * from yourTableName order by yourColumnName=0, yourColumnName;この構文のポイントは、yourColumnName=0 がブール値として評価される点です。値が0であれば「1(真)」、0以外であれば「0(偽)」となるため、昇順ソートでは0以外の値の行が先に並び、その後ろに0の行が配置され

  2. 【MySQL】単一クエリでUNION SELECTとIN句を組み合わせる方法

    はじめにMySQLでは、UNION SELECTとIN句を単一のクエリ内で組み合わせることができます。これにより、複数のテーブルのデータを統合した上で、特定の条件に一致するレコードだけを効率的に抽出できます。本記事では、2つのテーブルを作成し、サブクエリとUNIONを活用して目的のデータを取得する手順を具体例とともに解説します。最初のテーブルを作成するまず、以下のコマンドでテーブル「DemoTable1」を作成します。mysql> create table DemoTable1 -> ( -> StudentId int, -> StudentN