MySQLで値のリストをクエリする方法|IN演算子とFIELD関数の使い方
MySQLで特定の値のリストに一致するレコードを取得したい場合、IN演算子を使用します。さらに、ORDER BY FIELD()を組み合わせることで、指定した値の順序どおりに結果を並べ替えることも可能です。
基本構文
SELECT * FROM テーブル名 WHERE カラム名 IN(値1,値2,...N) ORDER BY FIELD(カラム名,値1,値2,...N);
この構文では、IN演算子によって指定した値のいずれかに一致する行だけを抽出し、FIELD関数によって値リストの並び順に従ってソートします。
サンプルテーブルの作成
まず、動作を確認するためのテーブルを作成しましょう。
mysql> create table ListOfValues
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(30),
-> Age int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.72 sec)次に、INSERTコマンドを使っていくつかのレコードを挿入します。
mysql> insert into ListOfValues(Name,Age) values('Carol',23);
Query OK, 1 row affected (0.14 sec)
mysql> insert into ListOfValues(Name,Age) values('Bob',25);
Query OK, 1 row affected (0.17 sec)
mysql> insert into ListOfValues(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.16 sec)
mysql> insert into ListOfValues(Name,Age) values('John',20);
Query OK, 1 row affected (0.37 sec)
mysql> insert into ListOfValues(Name,Age) values('Mike',28);
Query OK, 1 row affected (0.13 sec)
mysql> insert into ListOfValues(Name,Age) values('David',27);
Query OK, 1 row affected (0.21 sec)
mysql> insert into ListOfValues(Name,Age) values('Larry',21);
Query OK, 1 row affected (0.20 sec)登録データの確認
SELECT文を使って、テーブル内のすべてのレコードを表示してみます。
mysql> select *from ListOfValues;
実行結果は以下のとおりです。
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | Carol | 23 | | 2 | Bob | 25 | | 3 | Sam | 26 | | 4 | John | 20 | | 5 | Mike | 28 | | 6 | David | 27 | | 7 | Larry | 21 | +----+-------+------+ 7 rows in set (0.00 sec)
Ageカラムを基準に値のリストで抽出・並べ替え
ここからが本題です。Ageカラムを基準に、指定した値のリストに一致するレコードを、そのリストの順序どおりに取得するクエリは以下のとおりです。
mysql> select *from ListOfValues where Age IN(20,21,23,25,26,27,28) -> order by field(Age,20,21,23,25,26,27,28);
実行結果は以下のようになります。
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 4 | John | 20 | | 7 | Larry | 21 | | 1 | Carol | 23 | | 2 | Bob | 25 | | 3 | Sam | 26 | | 6 | David | 27 | | 5 | Mike | 28 | +----+-------+------+ 7 rows in set (0.06 sec)
出力を見ると、レコードがIN句で指定した値(20, 21, 23, 25, 26, 27, 28)の順番どおりに並んでいることがわかります。通常のORDER BYでは昇順・降順しか指定できませんが、FIELD関数を使うことで任意のカスタム順序でのソートが実現できます。
まとめ
- IN演算子:複数の値の中に一致するレコードを抽出できる
- ORDER BY FIELD():指定した値の順序に従って独自の並べ替えができる
この2つを組み合わせれば、「特定のIDの順序で表示したい」「優先度の高い値から順に並べたい」といった柔軟な要件にも対応できます。ぜひ活用してみてください。
-
MySQLでグループごとの最小値を複数取得するクエリの書き方
MySQLで「名前ごとなど、グループ単位の最小値」を一度に取得したい場面はよくあります。そんなときは、サブクエリとMIN()関数を組み合わせることで簡単に実現できます。この記事では、各人物の最も低いスコアを抽出する具体的手順を、テーブル作成から順に解説します。 サンプルテーブルの作成 まず、CREATE TABLE文でテスト用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Name varchar(20), &nbs
-
MySQLでカンマ区切りの文字列から特定の値を検索・選択する方法
カンマ区切りで保存された文字列の中に、特定の値が含まれているかを確認して行を抽出したい場合があります。そのようなときは、MySQLの FIND_IN_SET() 関数を使用すると便利です。FIND_IN_SET() は、第1引数に検索したい文字列、第2引数にカンマ区切りの文字列を指定し、見つかった位置(1始まり)を返します。見つからない場合は0が返されるため、「0より大きい」という条件と組み合わせることで、該当するレコードだけを取得できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table demo81 -> ( ->