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

Cố định một giá trị hàng và ORDER BY DESC phần còn lại trong MySQL


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.