Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL chọn N bản ghi cuối (bottom N records)

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 đương LIMIT 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ầuCú 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ấtORDER BY updated_at DESC LIMIT N
N giá trị nhỏ nhấtORDER BY col ASC LIMIT N
N giá trị lớn nhấtORDER 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, count vớ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)