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

MySQLでIN句に指定した順序どおりに行を取得する方法:FIND_IN_SET()の活用

IN句の順序で行を取得するには?

MySQLでは、IN句に指定した値の順序どおりに結果セットを取得したい場合、通常のクエリでは実現できません。そこで活躍するのが FIND_IN_SET() 関数です。この関数を ORDER BY 句と組み合わせることで、IN句で指定した値の並び順そのままに行をソートできます。

基本構文

SELECT yourVariableName.*
FROM yourTableName yourVariableName
WHERE yourVariableName.yourColumnName IN(value1,value2,...N)
ORDER BY FIND_IN_SET(yourVariableName.yourColumnName,'value1,value2,...N');

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

サンプルテーブルの作成

それでは、実際に動作を確認してみましょう。まずはテーブルを作成します。

mysql> create table InDemo
   -> (
   -> CodeId int,
   -> Name varchar(20)
   -> );
Query OK, 0 rows affected (0.95 sec)

次に、INSERTコマンドを使ってレコードを挿入します。

mysql> insert into InDemo values(1,'John');
Query OK, 1 row affected (0.24 sec)
mysql> insert into InDemo values(2,'Carol');
Query OK, 1 row affected (0.19 sec)
mysql> insert into InDemo values(3,'Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into InDemo values(4,'Bob');
Query OK, 1 row affected (0.17 sec)

テーブル内の全レコードを確認

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

mysql> select *from InDemo;

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

+--------+-------+
| CodeId | Name  |
+--------+-------+
|      1 | John  |
|      2 | Carol |
|      3 | Sam   |
|      4 | Bob   |
+--------+-------+
4 rows in set (0.00 sec)

IN句の順序で取得するクエリ

ここで、CodeId を「1, 3, 2, 4」の順序で取得したいとします。FIND_IN_SET()を使ったクエリは次のようになります。

mysql> select tbl.*
   -> from InDemo tbl
   -> where tbl.CodeId in(1,3,2,4)
   -> ORDER BY FIND_IN_SET(tbl.CodeId,'1,3,2,4');

実行結果を見てみましょう。

+--------+-------+
| CodeId | Name  |
+--------+-------+
|      1 | John  |
|      3 | Sam   |
|      2 | Carol |
|      4 | Bob   |
+--------+-------+
4 rows in set (0.00 sec)

ご覧のとおり、結果はIN句で指定した「1 → 3 → 2 → 4」の順序どおりに表示されています。このように、FIND_IN_SET()をORDER BY句に組み込むだけで、任意のカスタム順序でのソートが簡単に実現できます。

まとめ

  • IN句の順序で結果を取得するには FIND_IN_SET() 関数を使用する
  • FIND_IN_SET()は、リスト内での位置(インデックス)を返すため、ORDER BYの基準として使える
  • FIELD()関数を使う代替手法もある(ORDER BY FIELD(CodeId,1,3,2,4)

なお、数値カラムの場合は同様の目的で FIELD() 関数を使用することも可能です。状況に応じて使い分けるとよいでしょう。

  1. MySQLでUNIONとORDER BY句を組み合わせて使う方法

    UNIONはMySQLにおける演算子の一種で、ORDER BY句と組み合わせることで、結合後のレコードを自由に並べ替えることができます。複数のテーブルから行を順番に取得したい場合や、1つのテーブルから複数の行セットを取り出し、それらを1つの結果セットとして扱いたい場合にUNIONを使用します。ここでは、実際の例を使ってUNIONとORDER BYの使い方を解説します。最初のテーブルを作成するまず、サンプル用のテーブル「UnionDemo1」を作成します。 mysql> create table UnionDemo1 -> ( -> id int ->

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected