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

Lấy 30 bản ghi cuối cùng trong MySQL với ORDER BY DESC LIMIT

Để 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).
  • LIMIT với ORDER BY trên cột có index rất nhanh (chỉ duyệt 30 entry index).
  • Tránh OFFSET lớ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;