Để lấy N bản ghi mới nhất (theo ID hoặc timestamp), sắp xếp giảm dần (DESC) rồi giới hạn LIMIT N.
Cú pháp
SELECT * FROM ten_bang ORDER BY cot_sap_xep DESC LIMIT 30;
Ví dụ minh họa
Tạo bảng 37 hàng (ID 1-37):
CREATE TABLE DemoTable1567 (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY); INSERT INTO DemoTable1567 VALUES (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),();
Lấy 30 hàng cuối (ID lớn nhất):
SELECT * FROM DemoTable1567 ORDER BY Id DESC LIMIT 30;
Kết quả (ID 37 xuống 8)
| Id |
|---|
| 37 |
| 36 |
| 35 |
| 34 |
| 33 |
| 32 |
| 31 |
| 30 |
| 29 |
| 28 |
| 27 |
| 26 |
| 25 |
| 24 |
| 23 |
| 22 |
| 21 |
| 20 |
| 19 |
| 18 |
| 17 |
| 16 |
| 15 |
| 14 |
| 13 |
| 12 |
| 11 |
| 10 |
| 9 |
| 8 |
Mẹo: Lấy 30 hàng cuối nhưng sắp xếp TĂNG DẦN (ASC)
Dùng subquery:
SELECT * FROM (
SELECT * FROM DemoTable1567 ORDER BY Id DESC LIMIT 30
) AS t
ORDER BY Id ASC;
Kết quả: ID 8 → 37 (tăng dần).
Hiệu năng & Index
- Cần index trên cột
ORDER BY(Primary Key tự động có index). LIMITvớiORDER BYtrên cột có index rất nhanh (chỉ duyệt 30 entry index).- Tránh
OFFSETlớn (ví dụLIMIT 1000000, 30) — chậm do phải bỏ qua 1M hàng.
Phân trang (Pagination) đúng cách
-- Trang 1 (mới nhất) SELECT * FROM posts ORDER BY created_at DESC LIMIT 20; -- Trang 2: dùng cursor-based pagination (WHERE created_at < last_seen) thay vì OFFSET SELECT * FROM posts WHERE created_at < '2024-01-15 10:00:00' ORDER BY created_at DESC LIMIT 20;