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

Lấy 3 bản ghi cuối cùng nhưng sắp xếp tăng dần (ASC) trong MySQL

Yêu cầu: Lấy 3 bản ghi mới nhất (theo ID lớn nhất) nhưng hiển thị theo thứ tự ID tăng dần (cũ -> mới). Kỹ thuật: Dùng Subquery lấy 3 hàng mới nhất ORDER BY Id DESC LIMIT 3, sau đó bọc ngoài sắp xếp lại ORDER BY Id ASC.

Tạo bảng và dữ liệu 8 khách hàng

mysql> CREATE TABLE DemoTable (
    ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ClientName VARCHAR(100)
);

mysql> INSERT INTO DemoTable (ClientName) VALUES
('Larry'), ('Chris'), ('Bob'), ('David'), ('Carol'), ('Robert'), ('Sam'), ('Mike');

Dữ liệu đầy đủ

mysql> SELECT * FROM DemoTable;
+----------+------------+
| ClientId | ClientName |
+----------+------------+
|        1 | Larry      |
|        2 | Chris      |
|        3 | Bob        |
|        4 | David      |
|        5 | Carol      |
|        6 | Robert     |
|        7 | Sam        |
|        8 | Mike       |
+----------+------------+

Truy vấn: 3 khách hàng mới nhất, sắp xếp ID tăng dần

mysql> SELECT * FROM (
    SELECT * FROM DemoTable 
    ORDER BY ClientId DESC 
    LIMIT 3
) AS tbl
ORDER BY ClientId ASC;

Kết quả

+----------+------------+
| ClientId | ClientName |
+----------+------------+
|        6 | Robert     |
|        7 | Sam        |
|        8 | Mike       |
+----------+------------+

Giải thích từng bước

  1. Subquery: SELECT * FROM DemoTable ORDER BY ClientId DESC LIMIT 3 -> Lấy 3 hàng ID lớn nhất: 8, 7, 6 (thứ tự: 8, 7, 6).
  2. Outer query: SELECT * FROM (...) tbl ORDER BY ClientId ASC -> Sắp xếp lại 3 hàng đó tăng dần: 6, 7, 8.

Cách thay thế MySQL 8.0+ (Window Function)

SELECT ClientId, ClientName FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY ClientId DESC) AS rn
    FROM DemoTable
) t WHERE rn <= 3
ORDER BY ClientId ASC;

Ứng dụng

  • Hiển thị 3 bình luận mới nhất nhưng muốn người đọc thấy theo thứ tự thời gian (cũ nhất trước).
  • Log hệ thống: lấy 100 lỗi gần nhất nhưng hiển thị theo thời gian tăng dần để debug theo trình tự.