【MySQL】IDの昇順(ASC)で並べ替えた最後の3行を取得する方法
サブクエリを使った基本的な方法
IDの昇順(ASC)で並べ替えた状態で、テーブルの最後の3行だけを取得したい場合は、サブクエリを利用するのが最もシンプルです。まず内側のクエリでIDの降順(DESC)に並べ替えて上位3件を取り出し、その結果を外側のクエリで改めて昇順(ASC)に並べ替えます。
基本構文は以下の通りです。
SELECT * FROM (
SELECT * FROM yourTableName ORDER BY yourIdColumnName DESC LIMIT 3
) anyAliasName
ORDER BY yourIdColumnName;
実際に試してみよう
1. テーブルを作成する
まずはサンプル用のテーブルを作成します。
mysql> create table DemoTable
(
ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName varchar(100)
);
Query OK, 0 rows affected (0.60 sec)
2. レコードを挿入する
INSERTコマンドを使って、複数のレコードを追加していきます。
mysql> insert into DemoTable(ClientName) values('Larry');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(ClientName) values('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(ClientName) values('Bob');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(ClientName) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(ClientName) values('Carol');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(ClientName) values('Robert');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(ClientName) values('Sam');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(ClientName) values('Mike');
Query OK, 1 row affected (0.12 sec)
3. 全レコードを確認する
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select * from DemoTable;
実行結果は以下の通りです。合計8件のレコードが登録されています。
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 1 | Larry | | 2 | Chris | | 3 | Bob | | 4 | David | | 5 | Carol | | 6 | Robert | | 7 | Sam | | 8 | Mike | +----------+------------+ 8 rows in set (0.00 sec)
最後の3行をIDの昇順で取得するクエリ
それでは本題です。以下のクエリを実行すると、IDの昇順(ASC)に並べ替えた状態で最後の3行を取得できます。
mysql> SELECT * FROM ( SELECT * FROM DemoTable ORDER BY ClientId DESC LIMIT 3 ) tbl ORDER BY ClientId ASC;
実行結果は以下の通りです。IDが6〜8の、つまり最後に登録された3件が昇順で表示されています。
+----------+------------+ | ClientId | ClientName | +----------+------------+ | 6 | Robert | | 7 | Sam | | 8 | Mike | +----------+------------+ 3 rows in set (0.00 sec)
仕組みの解説
このクエリが期待どおりに動作する仕組みは次の2段階になっています。
- 内側のサブクエリ: ClientIdの降順(DESC)で全レコードを並べ替え、
LIMIT 3によってIDが最大の3行(=最後に登録されたレコード)を取り出します。 - 外側のクエリ: サブクエリの結果セットに対して、再びClientIdの昇順(ASC)で並べ替えることで、IDの小さい順に整列した「最後の3行」が得られます。
なお、FROM句内のサブクエリには必ずエイリアス(上記の例では「tbl」)を付ける必要がある点に注意してください。エイリアスがないと構文エラーになります。また、この手法はページング処理や「最新のN件を古い順に表示したい」といったケースでも広く活用できる定番テクニックです。
-
MySQLでSELECT文を使わずにテーブルが存在するかどうか確認する方法
MySQLでは、SHOWコマンドを使用することで、SELECT文を実行せずにテーブルの存在を簡単に確認できます。この記事では、具体的な手順と実行例をわかりやすく解説します。1. データベースを選択するまず、USEコマンドで対象のデータベースを選択します。mysql> USE business; Database changedこれで「business」データベースに切り替わりました。2. データベース内のテーブル一覧を表示する次に、SHOW tables;を実行すると、そのデータベースに存在するすべてのテーブルの一覧を取得できます。mysql> SHOW tables;実行結果は以
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected