Lấy N bản ghi cuối cùng (bottom N) trong MySQL
Để lấy N bản ghi cuối (theo thứ tự giá trị hoặc thời gian), sử dụng ORDER BY ... DESC kết hợp LIMIT.
Ví dụ minh họa
Tạo bảng DemoTable724:
mysql> CREATE TABLE DemoTable724 (Value INT); Query OK, 0 rows affected (0.79 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable724 VALUES(101); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO DemoTable724 VALUES(183); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO DemoTable724 VALUES(983); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO DemoTable724 VALUES(234); Query OK, 1 row affected (0.21 sec) mysql> INSERT INTO DemoTable724 VALUES(755); Query OK, 1 row affected (0.20 sec) mysql> INSERT INTO DemoTable724 VALUES(435); Query OK, 1 row affected (0.28 sec) mysql> INSERT INTO DemoTable724 VALUES(675); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO DemoTable724 VALUES(345); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable724 VALUES(948); Query OK, 1 row affected (0.14 sec)
Xem tất cả bản ghi (thứ tự chèn):
mysql> SELECT * FROM DemoTable724;
+-------+ | Value | +-------+ | 101 | | 183 | | 983 | | 234 | | 755 | | 435 | | 675 | | 345 | | 948 | +-------+ 9 rows in set (0.00 sec)
Lấy 4 bản ghi có giá trị lớn nhất (bottom 4 theo giá trị):
mysql> SELECT * FROM DemoTable724 ORDER BY Value DESC LIMIT 0, 4;
Kết quả:
+-------+ | Value | +-------+ | 983 | | 948 | | 755 | | 675 | +-------+ 4 rows in set (0.00 sec)
Giải thích
ORDER BY Value DESC: Sắp xếp giảm dần (lớn → nhỏ)LIMIT 0, 4: Bỏ qua 0 hàng, lấy 4 hàng tiếp theo (tương đươngLIMIT 4)- Kết quả: 4 giá trị lớn nhất = "4 bản ghi cuối" theo thứ tự giá trị
Các trường hợp "Bottom N" khác nhau
| Yêu cầu | Cú pháp |
|---|---|
| N bản ghi chèn cuối cùng (theo ID tự tăng) | ORDER BY id DESC LIMIT N |
| N bản ghi cập nhật gần nhất | ORDER BY updated_at DESC LIMIT N |
| N giá trị nhỏ nhất | ORDER BY col ASC LIMIT N |
| N giá trị lớn nhất | ORDER BY col DESC LIMIT N |
| Phân trang (trang 3, 10 bản ghi/trang) | ORDER BY id DESC LIMIT 20, 10 |
Lưu ý hiệu suất
- Nên có INDEX trên cột
ORDER BYđể tránh filesort LIMIT offset, countvới offset lớn sẽ chậm (MySQL phải scan qua offset hàng)- Phân trang sâu: dùng keyset pagination (
WHERE id < last_seen_id ORDER BY id DESC LIMIT N)