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

【MySQL】IN(1,2,3)とORDER BYを組み合わせてカスタム順序でソートするクエリの書き方

はじめに

MySQLでは、特定のIDだけを優先的に先頭に表示したいなど、独自の順序(カスタムオーダー)でレコードを並べ替えたいケースがあります。そのような場合には、ORDER BY句とCASE式を組み合わせることで、IN()による条件指定を活用した柔軟な並び替えが実現できます。

この記事では、実際にテーブルを作成し、Id IN (1,2,3) のレコードを優先的に表示しつつ、Nameカラムで並べ替える方法を具体的なSQL例とともに解説します。

テーブルの作成

まずはサンプル用のテーブルを作成しましょう。

mysql> create table DemoTable752 (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name varchar(100)
);
Query OK, 0 rows affected (0.63 sec)

レコードの挿入

続いて、INSERT文を使ってテーブルにデータを登録します。

mysql> insert into DemoTable752(Name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable752(Name) values('Carol');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable752(Name) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable752(Name) values('Mike');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable752(Name) values('Sam');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable752(Name) values('Adam');
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable752(Name) values('Chris');
Query OK, 1 row affected (0.26 sec)

登録済みデータの確認

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

mysql> select *from DemoTable752;

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

+----+-------+
| Id | Name  |
+----+-------+
|  1 | John  |
|  2 | Carol |
|  3 | Bob   |
|  4 | Mike  |
|  5 | Sam   |
|  6 | Adam  |
|  7 | Chris |
+----+-------+
7 rows in set (0.00 sec)

カスタム順序で並べ替えるクエリ

ここからが本題です。Id が IN (1,2,3) に該当するレコードを最優先で先頭に配置し、それ以外のレコードはIdの昇順、さらにNameでも並べ替えるには、次のようにCASE式を使います。

mysql> select *from DemoTable752
   order by
      case
         when Id IN (1,2,3) then 1
         else Id
   END,
Name;

実行結果

上記のクエリを実行すると、次の出力が得られます。

+----+-------+
| Id | Name  |
+----+-------+
|  3 | Bob   |
|  2 | Carol |
|  1 | John  |
|  4 | Mike  |
|  5 | Sam   |
|  6 | Adam  |
|  7 | Chris |
+----+-------+
7 rows in set (0.00 sec)

結果のポイント

注目すべき点として、Id 1〜3 のレコード(John、Carol、Bob)が先頭に集められ、その中でNameの昇順(Bob → Carol → John)に並んでいることがわかります。これはCASE式によって「Id IN (1,2,3)」のレコードには一律で値 1 が割り当てられ、それ以外のレコードにはIdの値がそのまま使われるためです。結果として、優先グループが最初にソートされ、残りのレコードは通常のId順に続きます。

まとめ

ORDER BY句内でCASE式とIN()を組み合わせれば、特定のレコードを優先的に表示するカスタムソートを簡単に実装できます。フラグ付きコンテンツの上位表示や、管理画面での重要データの強調など、実務でも活用場面の多いテクニックなので、ぜひ覚えておきましょう。

  1. MySQLで空のカラムにカスタムテキストを表示する方法

    MySQLでは、IF()関数を使うことで、空(NULLや空文字列)のカラムに対して任意のカスタムテキストを表示できます。ここでは、実際の手順を例とともに解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable-> (-> FirstName varchar(20)-> );Query OK, 0 rows affected (0.77 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテーブルにデータを追加します。このとき、意図的に空文字列のレコードも挿入しておきます。mysq

  2. MySQLでカラム内の値を検索するには?REGEXP_INSTR関数の使い方

    MySQLでカラム内の値を検索する方法MySQLでは、REGEXP_INSTR()関数を使うことで、指定したカラムに特定の文字列が含まれているかどうかを正規表現ベースで判定できます。マッチした場合は「1」、マッチしなかった場合は「0」を返すため、WHERE句と組み合わせることで柔軟な部分一致検索が可能になります。基本構文構文は以下の通りです。select *from yourTableName where REGEXP_INSTR(yourColumnName,yourSearchValue);サンプルテーブルの作成上記の構文を理解するために、まずテーブルを作成しましょう。mysql>