MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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 DESCLIMIT 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件だけを取得します

このように、重複の除外と降順ソート・件数制限を組み合わせることで、「最新の◯件だけをユニークな日付で取得したい」というよくある要件にシンプルに対応できます。

  1. 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

  2. MySQLで重複するタプルを検出してカウントを表示する方法

    MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入