Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL lấy 3 ngày mới nhất không trùng lặp

Lấy top N ngày mới nhất duy nhất (DISTINCT) trong MySQL

Kết hợp DISTINCT trong subquery để loại bỏ ngày trùng, sau đó ORDER BY DESC và LIMIT 3 để lấy 3 ngày lớn nhất.

1. Tạo bảng và chèn dữ liệu (có ngày trùng)

mysql> CREATE TABLE DemoTable (AdmissionDate DATE);
mysql> INSERT INTO DemoTable VALUES
    ('2019-09-04'), ('2019-08-10'), ('2019-09-21'), ('2019-09-18'),
    ('2019-09-21'), ('2019-08-18'), ('2019-09-18'), ('2019-09-16');

2. Xem dữ liệu (8 hàng, có trùng)

mysql> SELECT * FROM DemoTable;
+---------------+
| AdmissionDate |
+---------------+
| 2019-09-04    |
| 2019-08-10    |
| 2019-09-21    |
| 2019-09-18    |
| 2019-09-21    |  ← trùng
| 2019-08-18    |
| 2019-09-18    |  ← trùng
| 2019-09-16    |
+---------------+

3. Truy vấn: 3 ngày mới nhất KHÔNG TRÙNG

mysql> SELECT AdmissionDate FROM (
    SELECT DISTINCT AdmissionDate FROM DemoTable
) AS tbl
ORDER BY AdmissionDate DESC
LIMIT 3;

4. Kết quả

+---------------+
| AdmissionDate |
+---------------+
| 2019-09-21    |
| 2019-09-18    |
| 2019-09-16    |
+---------------+

Giải thích:

  • Subquery SELECT DISTINCT AdmissionDate: Loại trùng → 6 ngày duy nhất
  • ORDER BY DESC: Sắp xếp mới đến cũ
  • LIMIT 3: Lấy 3 hàng đầu

Các ngày duy nhất theo thứ tự giảm:

  1. 2019-09-21
  2. 2019-09-18
  3. 2019-09-16
  4. 2019-09-04
  5. 2019-08-18
  6. 2019-08-10

MySQL 8.0+ dùng CTE (dễ đọc hơn):

WITH distinct_dates AS (
    SELECT DISTINCT AdmissionDate FROM DemoTable
)
SELECT AdmissionDate FROM distinct_dates
ORDER BY AdmissionDate DESC LIMIT 3;

Lưu ý: Nên có index trên cột Date để tối ưu ORDER BY + LIMIT.