MySQLでSELECT…WHERE id IN()の結果を指定した順序で並べ替える方法(FIELD関数)
MySQLで SELECT … WHERE id IN(..) を実行すると、IN 句で指定した順序に関係なく、通常は主キーなどの順番で結果が返されます。そこで活躍するのが FIELD() 関数です。FIELD() 関数を ORDER BY と組み合わせることで、任意の列を基準に、指定した値の並び順どおりに結果を取得できます。
基本構文
SELECT *FROM yourTableName WHERE yourColumnName IN('value1','value2',.......N)
ORDER BY FIELD(yourColumnName,'value1','value2',.......N);FIELD() 関数は、第1引数で渡した値が、第2引数以降のリストの中で何番目に位置するかを数値で返します。この戻り値を基準にソートすることで、IN 句で指定した通りの順序で結果を並べ替えられる仕組みです。
サンプルテーブルの作成
構文を理解するために、まず動作確認用のテーブルを作成しましょう。
mysql> create table SelectOrderbyField -> ( -> Id int NOT NULL AUTO_INCREMENT, -> Name varchar(30), -> Age int, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (0.62 sec)
レコードの挿入
次に、INSERT コマンドを使ってテーブルにいくつかのレコードを登録します。
mysql> insert into SelectOrderbyField(Name,Age) values('John',23);
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectOrderbyField(Name,Age) values('Carol',25);
Query OK, 1 row affected (0.16 sec)
mysql> insert into SelectOrderbyField(Name,Age) values('Bob',21);
Query OK, 1 row affected (0.15 sec)
mysql> insert into SelectOrderbyField(Name,Age) values('Mike',28);
Query OK, 1 row affected (0.17 sec)
mysql> insert into SelectOrderbyField(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.12 sec)
mysql> insert into SelectOrderbyField(Name,Age) values('David',23);
Query OK, 1 row affected (0.19 sec)登録データの確認
SELECT 文ですべてのレコードを表示してみましょう。
mysql> select *from SelectOrderbyField;
以下が出力結果です。
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | John | 23 | | 2 | Carol | 25 | | 3 | Bob | 21 | | 4 | Mike | 28 | | 5 | Sam | 26 | | 6 | David | 23 | +----+-------+------+ 6 rows in set (0.00 sec)
ここから、FIELD() 関数を使った「select … where id in(..)」の並べ替えクエリを見ていきます。
ID列を基準に並べ替える
Id 列を指定した順序(5, 1, 3, 2, 6, 4)で並べ替えるクエリは以下の通りです。
mysql> select *from SelectOrderbyField where Id IN(5,1,3,2,6,4) -> order by field(Id,5,1,3,2,6,4);
出力結果を見ると、IN 句で指定した通りの順序でレコードが取得できているのが分かります。
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 5 | Sam | 26 | | 1 | John | 23 | | 3 | Bob | 21 | | 2 | Carol | 25 | | 6 | David | 23 | | 4 | Mike | 28 | +----+-------+------+ 6 rows in set (0.00 sec)
Name列を基準に並べ替える
文字列型の列でも同様に、Name 列を基準として正しく並べ替えることができます。クエリは以下の通りです。
mysql> select *from SelectOrderbyField where Name IN('Sam','John','Bob','Carol','David','Mike')
-> order by field(Name,'Sam','John','Bob','Carol','David','Mike');出力結果:
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 5 | Sam | 26 | | 1 | John | 23 | | 3 | Bob | 21 | | 2 | Carol | 25 | | 6 | David | 23 | | 4 | Mike | 28 | +----+-------+------+ 6 rows in set (0.03 sec)
まとめ
WHERE 句の IN 条件と組み合わせて FIELD() 関数を ORDER BY で使えば、数値・文字列を問わず、任意の列を指定した順序でソートできます。特定の優先順位でデータを表示したいケース(おすすめ商品の表示順やステータスの並び替えなど)に非常に便利なテクニックなので、ぜひ活用してみてください。
-
JavaでResultSetから列名を取得する方法!MySQLを使ったgetMetaData()の実装例を解説
ResultSetから列名を取得するには?getMetaData()メソッドの基本JavaでJDBCを使ってデータベース操作を行っていると、「検索結果(ResultSet)に含まれる列名(カラム名)を動的に知りたい」という場面によく出会います。そんなときに活躍するのが、getMetaData()メソッドです。このメソッドを呼び出すと、結果セットの構造情報(列の数や名前、型など)を持つResultSetMetaDataオブジェクトを取得できます。プロトタイプ宣言は以下のとおりです。ResultSetMetaData getMetaData() throws SQLException;サンプル用テ
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a