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 = 70trả về 1 cho dòng có Id=70, 0 cho các dòng khácDESCsắp 1 trước 0StudentId ASClà 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ểm | Nhượ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 |
CASE | Linh hoạt nhất | Code 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ợ.