Để lấy N bản ghi cuối (theo ID/timestamp) nhưng hiển thị theo thứ tự tăng dần, dùng subquery: lấy N hàng DESC trước, rồi bọc ngoài sắp xếp ASC.
Cú pháp
SELECT * FROM (
SELECT * FROM ten_bang ORDER BY cot_sap_xep DESC LIMIT 3
) AS alias
ORDER BY cot_sap_xep ASC;
Ví dụ minh họa
Tạo bảng 5 hàng:
CREATE TABLE DemoTable1579 (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(20));
INSERT INTO DemoTable1579 (Name) VALUES ('Robert'),('Bob'),('Chris'),('Sam'),('Mike');
Lấy 3 hàng cuối (Id 3,4,5) và sắp xếp tăng dần:
SELECT * FROM (
SELECT * FROM DemoTable1579 ORDER BY Id DESC LIMIT 3
) AS t
ORDER BY Id;
Kết quả
| Id | Name |
|---|---|
| 3 | Chris |
| 4 | Sam |
| 5 | Mike |
Giải thích
- Subquery:
ORDER BY Id DESC LIMIT 3→ lấy Id 5,4,3 (3 hàng mới nhất). - Outer query:
ORDER BY Id ASC→ sắp xếp lại 3,4,5. - Alias
AS tbắt buộc cho derived table.
MySQL 8.0+: CTE (Common Table Expression) dễ đọc hơn
WITH last_three AS (
SELECT * FROM DemoTable1579 ORDER BY Id DESC LIMIT 3
)
SELECT * FROM last_three ORDER BY Id;
Ứng dụng thực tế
- Hiển thị 10 tin nhắn mới nhất trong chat (cũ → mới).
- Biểu đồ thời gian: lấy 30 điểm dữ liệu gần nhất, vẽ theo thứ tự thời gian.
- Log audit: xem 5 hành động gần nhất theo thứ tự thời gian.