Truy xuất bản ghi có ngày mới nhất trong MySQL
Sử dụng hàm tổng hợp MAX() trên cột ngày trong truy vấn con để tìm giá trị ngày lớn nhất, sau đó lọc bản ghi chính bằng giá trị đó.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ExpiryDate DATE
);
mysql> INSERT INTO DemoTable (ExpiryDate) VALUES
('2018-12-31'), ('2019-09-01'), ('2019-09-01'),
('2016-08-30'), ('2019-06-23');
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+----+------------+ | Id | ExpiryDate | +----+------------+ | 1 | 2018-12-31 | | 2 | 2019-09-01 | | 3 | 2019-09-01 | | 4 | 2016-08-30 | | 5 | 2019-06-23 | +----+------------+
3. Truy vấn: Lấy bản ghi có ExpiryDate mới nhất
mysql> SELECT * FROM DemoTable
WHERE ExpiryDate = (SELECT MAX(ExpiryDate) FROM DemoTable);
4. Kết quả
+----+------------+ | Id | ExpiryDate | +----+------------+ | 2 | 2019-09-01 | | 3 | 2019-09-01 | +----+------------+
Giải thích:
- Truy vấn con
SELECT MAX(ExpiryDate) FROM DemoTabletrả về '2019-09-01' - Truy vấn chính lọc các hàng có ExpiryDate = '2019-09-01'
- Trả về 2 bản ghi (Id 2 và 3) vì cả hai cùng ngày mới nhất
Phương pháp thay thế (MySQL 8.0+):
SELECT * FROM DemoTable ORDER BY ExpiryDate DESC LIMIT 1;
Chỉ trả về 1 hàng (nếu muốn tất cả hàng cùng ngày max, dùng cách subquery).
Cách dùng JOIN (hiệu quả hơn trên bảng lớn):
SELECT d.* FROM DemoTable d JOIN (SELECT MAX(ExpiryDate) AS max_date FROM DemoTable) m ON d.ExpiryDate = m.max_date;