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

Sắp xếp theo giá trị cụ thể với MySQL ORDER BY?

Yêu cầu

Đưa một giá trị cụ thể lên đầu, các giá trị còn lại sắp xếp tăng dần bình thường.

Giải pháp: ORDER BY biểu thức boolean

Biểu thức StudentId = 70 trả về 1 (true) hoặc 0 (false). DESC đưa 1 lên trước.

Ví dụ minh họa

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (StudentId INT);

mysql> INSERT INTO DemoTable VALUES(100), (60), (70), (45), (55), (78);

Dữ liệu gốc

+-----------+
| StudentId |
+-----------+
| 100       |
| 60        |
| 70        |
| 45        |
| 55        |
| 78        |
+-----------+

Truy vấn: 70 lên đầu, còn lại ASC

mysql> SELECT * FROM DemoTable 
    -> ORDER BY StudentId = 70 DESC, StudentId ASC;

Kết quả

+-----------+
| StudentId |
+-----------+
| 70        |  <-- 70 lên đầu (true = 1)
| 45        |  <-- Còn lại ASC
| 55        |
| 60        |
| 78        |
| 100       |
+-----------+

Giải thích cơ chế

  • StudentId = 70 trả về 1 cho dòng có Id=70, 0 cho các dòng khác
  • DESC sắp 1 trước 0
  • StudentId ASC là tie-breaker cho nhóm 0

Mở rộng: Nhiều giá trị ưu tiên

Cách 1: CASE WHEN

ORDER BY CASE StudentId
    WHEN 70 THEN 1
    WHEN 60 THEN 2
    WHEN 55 THEN 3
    ELSE 4
END ASC, StudentId ASC;

Cách 2: FIELD() - Đọc dễ hơn

ORDER BY FIELD(StudentId, 70, 60, 55) DESC, StudentId ASC;

FIELD(str, val1, val2, ...) trả về vị trí (1-based) hoặc 0 nếu không có.

Cách 3: FIND_IN_SET()

ORDER BY FIND_IN_SET(StudentId, '70,60,55') DESC, StudentId ASC;

So sánh

Phương phápƯu điểmNhược điểm
col = val DESCĐơn giản, 1 giá trịChỉ 1 giá trị ưu tiên
FIELD()Đọc dễ, nhiều giá trịChậm hơn CASE chút
CASELinh hoạt nhấtCode dài hơn

Lưu ý

Biểu thức boolean trong ORDER BY hoạt động vì MySQL coi TRUE=1, FALSE=0. Chuẩn SQL khác có thể không hỗ trợ.