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

MySQLのIN(…)句で指定した値と同じ順序でクエリ結果を返す方法

MySQLのORDER BY FIELD()を使って、指定した値の順序どおりに結果を取得する

結論から言うと、可能です。MySQLでは ORDER BY FIELD() を使うことで、IN(…)FIELD() に渡した値と同じ並び順でクエリ結果を取得できます。

ここでは、実際にテーブルを作成して動作を確認していきましょう。

1. テーブルを作成する

まず、サンプル用のテーブルを作成します。

mysql> create table DemoTable
-> (
-> Number int
-> );
Query OK, 0 rows affected (0.54 sec)

DemoTable という名前で、int型のカラム Number を1つだけ持つシンプルなテーブルです。

2. テーブルにレコードを挿入する

次に、INSERT文を使って複数のレコードを登録します。

mysql> insert into DemoTable values(19);
Query OK, 1 row affected (0.20 sec)

mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.20 sec)

mysql> insert into DemoTable values(34);
Query OK, 1 row affected (0.32 sec)

mysql> insert into DemoTable values(28);
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable values(25);
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values(29);
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values(24);
Query OK, 1 row affected (0.14 sec)

3. 登録されたレコードを確認する

SELECT文でテーブル内の全レコードを表示してみましょう。

mysql> select *from DemoTable;

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

+--------+
| Number |
+--------+
| 19 |
| 30 |
| 34 |
| 28 |
| 25 |
| 29 |
| 24 |
+--------+
7 rows in set (0.00 sec)

通常、SELECT文はテーブルに格納された順序(またはインデックスの状況に応じた順序)で結果を返すため、指定した通りの並びにはなりません。

4. ORDER BY FIELD()で任意の順序に並べ替える

ここがポイントです。ORDER BY FIELD() を使うと、関数に渡した値の並び順そのままに結果をソートできます。

mysql> select *from DemoTable
-> ORDER BY FIELD(Number, 30,19,34,25,28,29,24) ;

FIELD(Number, 30,19,34,25,28,29,24) は、カラム Number の値が第2引数以降のリストの何番目にあるかを返す関数です。この戻り値でソートすることで、リストの順序=結果の順序になります。

実行結果

+--------+
| Number |
+--------+
| 30 |
| 19 |
| 34 |
| 25 |
| 28 |
| 29 |
| 24 |
+--------+
7 rows in set (0.00 sec)

FIELD() の第2引数以降に指定した 30, 19, 34, 25, 28, 29, 24まったく同じ順序で結果が返されていることが確認できます。

まとめ

  • MySQLでクエリ結果を任意の順序で取得したい場合は ORDER BY FIELD(カラム名, 値1, 値2, ...) を使う。
  • FIELD() は値がリスト内の何番目に存在するかを返すため、それをソートキーとして利用できる。
  • IDのリストをアプリケーション側で保持しており、その表示順のままDBから取得したいケースなどで非常に便利。

なお、値の数が多い場合や頻繁に呼び出されるクエリでは、FIELD() によるソートがインデックスを利用できない点に注意してください。パフォーマンスが気になる場合は、並び順を持つカラムを別途用意する方法も検討するとよいでしょう。

  1. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(

  2. MySQLでSELECTクエリの結果を並べ替える方法|ORDER BY句の基本と実践例

    データベース操作では、テーブルから特定のデータや行を抽出することが日常的によくあります。通常、SELECT文で取得した行はテーブル内に格納されている順序で返されますが、場合によっては、特定の列を基準にして昇順または降順で並べ替えた結果を取得したいこともあるでしょう。そんなときに活躍するのが「ORDER BY」句です。以下で具体的な使い方を見ていきましょう。例えば、「name」フィールドを含む複数のカラムを持つテーブルがあるとします。テーブルからすべての行を取得したいけれど、名前のアルファベット順に並べ替えた状態で結果を受け取りたい——こうしたケースでは、ORDER BY句を使って「name」フ