MySQLのORDER BYでLIKE条件を使って並び替える方法
MySQLでは、ORDER BY句の中でCASE式とLIKE演算子を組み合わせることで、特定のパターンに一致する行を優先的に並び替えることができます。通常のORDER BYはカラムの値を基準にソートしますが、この手法を使えば「文字列の一部が一致するかどうか」という柔軟な条件でのソートが可能になります。本記事では、具体的な構文と実行例を通じて、その使い方をわかりやすく解説します。
基本構文
LIKE条件に基づいて並び替えるには、ORDER BY句の中でCASE式を使用します。基本構文は以下の通りです。
SELECT *FROM yourTableName ORDER BY CASE WHEN yourColumnName like '%yourPatternValue1%' then 1 WHEN yourColumnName like '%yourPatternValue2%' then 2 else 3 end;
この構文の仕組みはシンプルです。CASE式は、条件に一致した場合に指定した数値(1、2…)を返し、どの条件にも一致しない場合はELSEで指定した値(ここでは3)を返します。ORDER BYはこの数値の昇順でソートするため、結果として以下の順序で表示されます。
- 1: パターン1に一致する行が最も先頭
- 2: パターン2に一致する行が次
- 3: どちらにも一致しない行が最後
サンプルテーブルの作成
それでは、実際に動作を確認してみましょう。まずはテスト用のテーブルを作成します。
mysql> create table OrderByLikeDemo -> ( -> Id int, -> Name varchar(100) -> ); Query OK, 0 rows affected (1.84 sec)
テーブルにはId(数値型)とName(文字列型)の2つのカラムを定義しています。
テストデータの挿入
次に、INSERT文を使ってサンプルデータを登録します。
mysql> insert into OrderByLikeDemo values(100,'John Smith'); Query OK, 1 row affected (0.18 sec) mysql> insert into OrderByLikeDemo values(101,'Carol Taylor'); Query OK, 1 row affected (0.23 sec) mysql> insert into OrderByLikeDemo values(102,'David Miller'); Query OK, 1 row affected (0.12 sec) mysql> insert into OrderByLikeDemo values(103,'Mike Taylor'); Query OK, 1 row affected (0.18 sec) mysql> insert into OrderByLikeDemo values(104,'Bob Miller'); Query OK, 1 row affected (0.11 sec) mysql> insert into OrderByLikeDemo values(105,'Sam Williams'); Query OK, 1 row affected (0.16 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from OrderByLikeDemo;
実行結果は以下の通りです。
+------+--------------+ | Id | Name | +------+--------------+ | 100 | John Smith | | 101 | Carol Taylor | | 102 | David Miller | | 103 | Mike Taylor | | 104 | Bob Miller | | 105 | Sam Williams | +------+--------------+ 6 rows in set (0.00 sec)
LIKE条件で並び替えるクエリの実行
ここからが本題です。「名前に『Taylor』を含む人を最優先」「次に『Miller』を含む人」を優先して表示したい場合、以下のようなクエリを実行します。
mysql> select *from OrderByLikeDemo -> order by case -> when Name like '%Taylor%' then 1 -> when Name like '%Miller%' then 2 -> else 3 -> end;
実行結果は以下のようになります。
+------+--------------+ | Id | Name | +------+--------------+ | 101 | Carol Taylor | | 103 | Mike Taylor | | 102 | David Miller | | 104 | Bob Miller | | 100 | John Smith | | 105 | Sam Williams | +------+--------------+ 6 rows in set (0.00 sec)
結果を見ると、期待どおりの並び順になっていることがわかります。
- 優先度1(%Taylor%): Carol Taylor、Mike Taylor
- 優先度2(%Miller%): David Miller、Bob Miller
- 優先度3(ELSE): John Smith、Sam Williams
応用のポイント
この手法は、単純な並び替えにとどまらず、さまざまな場面で応用できます。
- 検索結果の関連性ソート: 検索キーワードとの一致度に応じて、完全一致・部分一致・不一致の順に表示したい場合に有効です。
- 複数条件の組み合わせ:
CASE式のWHENを増やせば、3つ以上のパターンにも対応できます。 - 昇順・降順の制御:
ENDの後にDESCを付ければ、逆順にすることも可能です(例:ORDER BY CASE ... END DESC)。
まとめ
MySQLでLIKE条件を使って並び替えたい場合は、ORDER BY句内でCASE式を活用するのが定番のアプローチです。パターンごとに優先度となる数値を返すことで、文字列の部分一致に基づいた柔軟なソートが実現できます。検索機能の精度向上や、特定レコードの優先表示など、実務でも役立つテクニックなので、ぜひ覚えておきましょう。
-
単一のMySQLクエリでGROUP BYとFIELD関数を組み合わせて任意の順序で並べ替える方法
MySQLでは、GROUP BY句とORDER BY FIELD()関数を組み合わせることで、グループ化した結果を指定したカスタム順序で並べ替えることができます。この記事では、実際にテーブルを作成し、データを挿入しながら、その手順をわかりやすく解説します。1. サンプルテーブルの作成まず、テスト用のテーブルを作成します。ここでは、メッセージ文字列を格納する「DemoTable」というテーブルを用意します。mysql> create table DemoTable ( Message text ); Query OK, 0 rows affected (1.15 sec)2. レコ
-
MySQLで0を末尾に回して並べ替える!条件付きSELECTとORDER BYの使い方
MySQLでは、ORDER BY句に「カラム名=0」という条件式を組み合わせることで、0以外の値を昇順に並べたうえで、0のレコードだけを末尾にまとめて表示できます。この記事では、その具体的な書き方と実行例を分かりやすく解説します。基本構文select * from yourTableName order by yourColumnName=0, yourColumnName;この構文のポイントは、yourColumnName=0 がブール値として評価される点です。値が0であれば「1(真)」、0以外であれば「0(偽)」となるため、昇順ソートでは0以外の値の行が先に並び、その後ろに0の行が配置され