【MySQL】LIMIT句の後に別のカラムで並べ替える方法(サブクエリ活用)
MySQLでLIMIT句の後に別の順序で並べ替える方法
MySQLでは、LIMIT句で取得する行数を絞り込んだ後、さらに別のカラムを基準に並べ替えたいケースがあります。このような場合にはサブクエリ(副問い合わせ)を使用します。内側のSELECT文で対象の行を取得し、外側のSELECT文で目的の順序に並べ替えるという、2段階の処理を行うのがポイントです。
なお、単一のクエリ内で「ORDER BY → LIMIT → 別のORDER BY」という順序を直接記述することはできません。そのため、一度サブクエリでLIMITを適用した結果セットを作成し、それを外側のクエリで再度並べ替えるという手法が用いられます。
基本構文
SELECT *FROM
(
SELECT *FROM yourTableName ORDER BY yourColumnName1 DESC LIMIT 9
) AS anyAliasName
ORDER BY yourColumnName2;
上記の構文を理解するために、まずテーブルを作成しましょう。テーブルを作成するクエリは以下のとおりです。
mysql> create table OrderByAfterLimit
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> UserName varchar(20),
-> UserAge int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.69 sec)
次に、insertコマンドを使ってテーブルにレコードを挿入します。クエリは以下のとおりです。
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('John',23);
Query OK, 1 row affected (0.24 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Larry',21);
Query OK, 1 row affected (0.36 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Bob',26);
Query OK, 1 row affected (0.19 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('James',22);
Query OK, 1 row affected (0.18 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Robert',28);
Query OK, 1 row affected (0.20 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Mike',29);
Query OK, 1 row affected (0.19 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Carol',24);
Query OK, 1 row affected (0.13 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('David',20);
Query OK, 1 row affected (0.23 sec)
mysql> insert into OrderByAfterLimit(UserName, UserAge) values('Maxwell',30);
Query OK, 1 row affected (0.46 sec)select文を使用して、テーブルの全レコードを表示してみましょう。クエリは以下のとおりです。
mysql> select *from OrderByAfterLimit;
以下が出力結果です。
+----+----------+---------+
| Id | UserName | UserAge |
+----+----------+---------+
| 1 | John | 23 |
| 2 | Larry | 21 |
| 3 | Bob | 26 |
| 4 | James | 22 |
| 5 | Robert | 28 |
| 6 | Mike | 29 |
| 7 | Carol | 24 |
| 8 | David | 20 |
| 9 | Maxwell | 30 |
+----+----------+---------+
9 rows in set (0.00 sec)
LIMIT句の後に並べ替えを実行するクエリ
ここからが本題です。LIMIT句の適用後に別のカラムで並べ替えを行うクエリは、以下のように記述します。
mysql> select *from
-> (
-> select *from OrderByAfterLimit order by UserAge DESC LIMIT 9) AS tbl1
-> order by UserName;
このクエリでは、内側のサブクエリでUserAgeの降順に並べ替えたうえでLIMIT 9により上位9件を取得し、その結果セットに対して外側のクエリがUserNameの昇順で並べ替えています。実行すると、以下のような出力が得られます。
+----+----------+---------+
| Id | UserName | UserAge |
+----+----------+---------+
| 3 | Bob | 26 |
| 7 | Carol | 24 |
| 8 | David | 20 |
| 4 | James | 22 |
| 1 | John | 23 |
| 2 | Larry | 21 |
| 9 | Maxwell | 30 |
| 6 | Mike | 29 |
| 5 | Robert | 28 |
+----+----------+---------+
9 rows in set (0.00 sec)
このように、サブクエリとエイリアス(AS tbl1)を組み合わせることで、「LIMITで絞り込んだ結果を、さらに別の基準でソートする」という処理を簡単に実現できます。ランキング形式のデータを五十音順やアルファベット順に表示したい場合などに、ぜひ活用してください。
-
MySQLでユーザー定義変数(数値)を使ってORDER BYを実行する方法
MySQLでは、ユーザー定義変数とPREPARE文(プリペアドステートメント)を組み合わせることで、ORDER BYの条件を動的に指定できます。この記事では、数値型のユーザー定義変数を使用してORDER BYを実行する手順を、サンプルコード付きで詳しく解説します。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable1898 ( Number int ); Query OK, 0 rows affected (0.00 sec)2. レコードの挿入続いて、INSERTコマンドを使ってテーブ
-
MySQLでVARCHAR文字列からハイフン以降の数値を削除する方法(SUBSTRING_INDEX活用)
MySQLで「John-232」のようなハイフンを含むVARCHAR型の文字列から、ハイフン以降の数値部分を削除したい場合があります。このような処理には、SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。SUBSTRING_INDEX()関数とはSUBSTRING_INDEX(文字列, 区切り文字, 出現回数) は、指定した区切り文字が現れる位置より前の部分文字列を返す関数です。第3引数に「1」を指定すると、区切り文字が最初に出現する位置より前の文字列だけが取得されます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create t