MySQLでテーブル内の最新3件の日付を重複なしで取得するクエリの書き方
テーブルから最新の日付を取得するには、ORDER BY DESCを使って日付レコードを降順に並べ替えます。今回は3件だけ取得したいので、LIMIT 3を組み合わせます。さらに、同じ日付が複数登録されている場合に備えて、DISTINCTで重複を除外するのがポイントです。
サンプルテーブルの作成
まず、日付を格納するテーブルを作成しましょう。
mysql> create table DemoTable
(
AdmissionDate date
);
Query OK, 0 rows affected (0.56 sec)
レコードの挿入
INSERTコマンドを使って、テーブルにいくつかのレコードを追加します。ここでは説明のため、あえて同じ日付を複数回登録しています。
mysql> insert into DemoTable values('2019-09-04');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('2019-08-10');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-09-21');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('2019-09-18');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-09-21');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('2019-08-18');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2019-09-18');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('2019-09-16');
Query OK, 1 row affected (0.10 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみます。
mysql> select * from DemoTable;
実行すると、次のような出力が得られます。同じ日付が重複して登録されているのが分かります。
+---------------+ | AdmissionDate | +---------------+ | 2019-09-04 | | 2019-08-10 | | 2019-09-21 | | 2019-09-18 | | 2019-09-21 | | 2019-08-18 | | 2019-09-18 | | 2019-09-16 | +---------------+ 8 rows in set (0.00 sec)
最新3件の日付を重複なしで取得するクエリ
以下が、テーブル内の最新3つの日付を重複なく取得するためのクエリです。サブクエリでDISTINCTにより重複を排除してから、ORDER BY DESCとLIMIT 3で新しい順に上位3件を取り出しています。
mysql> select AdmissionDate from (select distinct AdmissionDate from DemoTable) tbl order by AdmissionDate desc limit 3;
実行結果は次のとおりです。
+---------------+ | AdmissionDate | +---------------+ | 2019-09-21 | | 2019-09-18 | | 2019-09-16 | +---------------+ 3 rows in set (0.00 sec)
クエリのポイント解説
このクエリの動作を整理すると、次の3つの要素で成り立っています。
- DISTINCT:同じ日付が複数存在しても1つにまとめ、重複を排除します
- ORDER BY 〜 DESC:日付を新しい順(降順)に並べ替えます
- LIMIT 3:並べ替えた結果の先頭から3件だけを取得します
このように、重複の除外と降順ソート・件数制限を組み合わせることで、「最新の◯件だけをユニークな日付で取得したい」というよくある要件にシンプルに対応できます。
-
MySQLでテーブルをクエリし、直近3日より前に投稿された行を取得する方法
はじめにここでは、現在の日付を「2019-10-20」として話を進めます。まずは例として、テーブルを作成してみましょう。mysql> create table DemoTable1582 -> ( -> PostedDate datetime -> );Query OK, 0 rows affected (13.36 sec)レコードの挿入insertコマンドを使用して、テーブルにいくつかのレコードを挿入します。mysql> insert into DemoTable1582 values(2019-01-21 12:34:40);Query O
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入