Yêu cầu: Lấy 3 bản ghi mới nhất (theo ID lớn nhất) nhưng hiển thị theo thứ tự ID tăng dần (cũ -> mới). Kỹ thuật: Dùng Subquery lấy 3 hàng mới nhất ORDER BY Id DESC LIMIT 3, sau đó bọc ngoài sắp xếp lại ORDER BY Id ASC.
Tạo bảng và dữ liệu 8 khách hàng
mysql> CREATE TABLE DemoTable (
ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName VARCHAR(100)
);
mysql> INSERT INTO DemoTable (ClientName) VALUES
('Larry'), ('Chris'), ('Bob'), ('David'), ('Carol'), ('Robert'), ('Sam'), ('Mike');
Dữ liệu đầy đủ
mysql> SELECT * FROM DemoTable;
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 1 | Larry |
| 2 | Chris |
| 3 | Bob |
| 4 | David |
| 5 | Carol |
| 6 | Robert |
| 7 | Sam |
| 8 | Mike |
+----------+------------+
Truy vấn: 3 khách hàng mới nhất, sắp xếp ID tăng dần
mysql> SELECT * FROM (
SELECT * FROM DemoTable
ORDER BY ClientId DESC
LIMIT 3
) AS tbl
ORDER BY ClientId ASC;
Kết quả
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 6 | Robert |
| 7 | Sam |
| 8 | Mike |
+----------+------------+
Giải thích từng bước
- Subquery:
SELECT * FROM DemoTable ORDER BY ClientId DESC LIMIT 3-> Lấy 3 hàng ID lớn nhất: 8, 7, 6 (thứ tự: 8, 7, 6). - Outer query:
SELECT * FROM (...) tbl ORDER BY ClientId ASC-> Sắp xếp lại 3 hàng đó tăng dần: 6, 7, 8.
Cách thay thế MySQL 8.0+ (Window Function)
SELECT ClientId, ClientName FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY ClientId DESC) AS rn
FROM DemoTable
) t WHERE rn <= 3
ORDER BY ClientId ASC;
Ứng dụng
- Hiển thị 3 bình luận mới nhất nhưng muốn người đọc thấy theo thứ tự thời gian (cũ nhất trước).
- Log hệ thống: lấy 100 lỗi gần nhất nhưng hiển thị theo thời gian tăng dần để debug theo trình tự.