MySQLで文字列の最後の3文字を基準にソートする方法
MySQLでは、ORDER BY句とRIGHT()関数を組み合わせることで、カラム値の末尾3文字を基準にレコードを並べ替えることができます。名前に番号が含まれるデータなど、文字列の一部だけで順序を制御したい場合に非常に便利なテクニックです。
基本構文
末尾3文字でソートする場合の基本構文は以下のとおりです。
SELECT * FROM yourTableName ORDER BY RIGHT(yourColumnName, 3) yourSortingOrder;
yourSortingOrderの部分をASC(昇順)またはDESC(降順)に置き換えることで、それぞれ昇順・降順の並び替えを指定できます。
動作確認用テーブルの作成
それでは、実際にこの構文がどのように動作するか確認してみましょう。まずはサンプル用のテーブルを作成します。
mysql> create table OrderByLast3Chars
-> (
-> EmployeeId int NOT NULL AUTO_INCREMENT,
-> EmployeeName varchar(20),
-> EmployeeAge int,
-> PRIMARY KEY(EmployeeId)
-> );
Query OK, 0 rows affected (0.56 sec)次に、INSERT文を使っていくつかのレコードを挿入します。従業員名の末尾には3桁の番号が付与されている点に注目してください。
mysql> insert into OrderByLast3Chars(EmployeeName,EmployeeAge) values('Carol_901',24);
Query OK, 1 row affected (0.14 sec)
mysql> insert into OrderByLast3Chars(EmployeeName,EmployeeAge) values('Bob_101',21);
Query OK, 1 row affected (0.19 sec)
mysql> insert into OrderByLast3Chars(EmployeeName,EmployeeAge) values('Sam_107',22);
Query OK, 1 row affected (0.20 sec)
mysql> insert into OrderByLast3Chars(EmployeeName,EmployeeAge) values('Mile_677',26);
Query OK, 1 row affected (0.19 sec)
mysql> insert into OrderByLast3Chars(EmployeeName,EmployeeAge) values('John_978',27);
Query OK, 1 row affected (0.75 sec)
mysql> insert into OrderByLast3Chars(EmployeeName,EmployeeAge) values('David_876',29);
Query OK, 1 row affected (0.28 sec)SELECT文ですべてのレコードを表示してみます。
mysql> select *from OrderByLast3Chars;
実行結果は以下のとおりです。現時点では挿入順にレコードが並んでいます。
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | 1 | Carol_901 | 24 | | 2 | Bob_101 | 21 | | 3 | Sam_107 | 22 | | 4 | Mile_677 | 26 | | 5 | John_978 | 27 | | 6 | David_876 | 29 | +------------+--------------+-------------+ 6 rows in set (0.00 sec)
ケース1:昇順(ASC)で並べ替える
まずは、名前の末尾3文字を基準に昇順でソートするクエリを見てみましょう。
mysql> select *from OrderByLast3Chars
-> order by RIGHT(EmployeeName,3) asc;実行結果は以下のとおりです。末尾の番号(101 → 107 → 677 → 876 → 901 → 978)の順に正しく並べ替えられていることがわかります。
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | 2 | Bob_101 | 21 | | 3 | Sam_107 | 22 | | 4 | Mile_677 | 26 | | 6 | David_876 | 29 | | 1 | Carol_901 | 24 | | 5 | John_978 | 27 | +------------+--------------+-------------+ 6 rows in set (0.00 sec)
ケース2:降順(DESC)で並べ替える
続いて、降順でソートする場合はDESCを指定します。クエリは以下のとおりです。
mysql> select *from OrderByLast3Chars
-> order by RIGHT(EmployeeName,3) desc;実行結果は以下のとおりです。今度は番号の大きいものから順に並んでいます。
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | 5 | John_978 | 27 | | 1 | Carol_901 | 24 | | 6 | David_876 | 29 | | 4 | Mile_677 | 26 | | 3 | Sam_107 | 22 | | 2 | Bob_101 | 21 | +------------+--------------+-------------+ 6 rows in set (0.00 sec)
まとめ
このように、RIGHT(カラム名, 文字数)関数をORDER BY句内で使用すれば、文字列全体ではなく指定した桁数の末尾部分だけを基準にソートできます。LEFT()関数を使えば先頭からの部分文字列でのソートも可能なので、用途に応じて使い分けるとよいでしょう。
-
MySQLでNULL値を含むカラムを並べ替える方法|IS NULLとORDER BYの活用
MySQLでは、ORDER BY句で並べ替えを行う際、NULL値がどの位置に表示されるか悩むことがあります。本記事では、IS NULL演算子を組み合わせることで、NULL値を含むレコードを末尾にまとめて並べ替える方法を、実際のサンプルコードとともにわかりやすく解説します。テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable707 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentFirstName varchar(100), Stude
-
MySQLでORDER BY FIELD()を使って複数のID順にレコードを並べ替える方法
MySQLでは、ORDER BY FIELD()を使用することで、任意のIDの順序に従ってレコードを並べ替えることができます。通常のORDER BY句は昇順・降順でのソートしか行えませんが、FIELD()関数と組み合わせることで、指定した値の並び順そのものをソート基準として利用できます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable( ClientId varchar(40), ClientName varchar(40) ); Query OK, 0 rows affected (0.55 s