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

MySQL: ORDER BY sau LIMIT (Subquery)

Để lấy N bản ghi theo thứ tự này, rồi sắp xếp lại theo thứ tự khác, dùng subquery: SELECT ... FROM (SELECT ... ORDER BY ... LIMIT N) AS t ORDER BY ....

Cú pháp

SELECT * FROM (
    SELECT * FROM ten_bang ORDER BY cot_1 DESC LIMIT n
) AS bang_tam
ORDER BY cot_2;

Ví dụ minh họa

Tạo bảng 9 người dùng:

mysql> CREATE TABLE SapXepSauLimit (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Ten VARCHAR(20),
    -> Tuoi INT
    -> );

Chèn dữ liệu (tuổi khác nhau):

mysql> INSERT INTO SapXepSauLimit(Ten, Tuoi) VALUES
    -> ('John', 23), ('Larry', 21), ('Bob', 26), ('James', 22),
    -> ('Robert', 28), ('Mike', 29), ('Carol', 24), ('David', 20), ('Maxwell', 30);

Bước 1: Lấy 9 người tuổi cao nhất (DESC)

mysql> SELECT * FROM SapXepSauLimit ORDER BY Tuoi DESC LIMIT 9;

→ Trả về 9 người từ tuổi 30 xuống 20.

Bước 2: Sắp xếp lại kết quả đó theo tên (ASC)

mysql> SELECT * FROM (
    ->   SELECT * FROM SapXepSauLimit ORDER BY Tuoi DESC LIMIT 9
    -> ) AS tbl1
    -> ORDER BY Ten;

Kết quả cuối (9 người, sắp xếp A-Z):

+----+----------+------+
| Id | Ten      | Tuoi |
+----+----------+------+
| 3  | Bob      | 26   |
| 7  | Carol    | 24   |
| 8  | David    | 20   |
| 4  | James    | 22   |
| 1  | John     | 23   |
| 2  | Larry    | 21   |
| 9  | Maxwell  | 30   |
| 6  | Mike     | 29   |
| 5  | Robert   | 28   |
+----+----------+------+

Ứng dụng: Phân trang kết quả "Top N" nhưng hiển thị theo alphabet. MySQL 8.0+ có thể dùng WITH (CTE) cho rõ ràng hơn.