Vấn đề
Muốn một giá trị cụ thể (ví dụ id=10) luôn xuất hiện **đầu tiên**, các giá trị khác sắp xếp giảm dần (DESC) sau đó.
Giải pháp: ORDER BY biểu thức boolean
ORDER BY id = 10 DESC, id ASC
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (id INT);
mysql> INSERT INTO DemoTable VALUES (10), (7), (8), (6), (9), (11);
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------+ | id | +------+ | 10 | | 7 | | 8 | | 6 | | 9 | | 11 | +------+
Truy vấn cố định id=10 lên đầu, phần còn lại ASC
mysql> SELECT * FROM DemoTable ORDER BY id = 10 DESC, id ASC;
Kết quả
+------+ | id | +------+ | 10 | -- id=10 → TRUE (1) → lên đầu | 6 | -- FALSE (0) → sắp ASC: 6,7,8,9,11 | 7 | | 8 | | 9 | | 11 | +------+
Giải thích
id = 10: Biểu thức boolean. TRUE=1, FALSE=0.DESC: 1 > 0 → hàng TRUE lên đầu.id ASC: Tie-breaker cho nhóm FALSE (các id khác).
Mở rộng: Cố định nhiều giá trị theo thứ tự tùy chỉnh
ORDER BY FIELD(id, 10, 20, 30) DESC, id ASC
FIELD(id, 10,20,30)trả về 1,2,3 tương ứng. DESC → 3,2,1,0.- Id=30 lên đầu, rồi 20, rồi 10, rồi các id khác ASC.
Lưu ý
- Kỹ thuật này gọi là "custom sorting" hoặc "pinned sorting".
- Không dùng index cho ORDER BY này (filesort).
- Phù hợp cho bảng nhỏ/vừa, hoặc kết hợp LIMIT.