Giới thiệu
Khi cần sắp xếp kết quả theo thứ tự ID cụ thể (không phải alphabet hay numeric), dùng ORDER BY CASE gán trọng số cho từng ID.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable1550 (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.61 sec)
mysql> insert into DemoTable1550 values(101,'Chris');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1550 values(110,'Bob');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable1550 values(105,'Carol');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1550 values(109,'Mike');
Query OK, 1 row affected (0.17 sec)
2. Dữ liệu gốc
mysql> select * from DemoTable1550;
+------+-------+ | Id | Name | +------+-------+ | 101 | Chris | | 110 | Bob | | 105 | Carol | | 109 | Mike | +------+-------+ 4 rows in set (0.00 sec)
3. Truy vấn sắp xếp theo thứ tự ID: 109, 101, 110
mysql> select * from DemoTable1550
-> where Id IN(109,101,110)
-> order by case Id
-> when 109 then 1001
-> when 101 then 1002
-> when 110 then 1003
-> end;
4. Kết quả
+------+-------+ | Id | Name | +------+-------+ | 109 | Mike | | 101 | Chris | | 110 | Bob | +------+-------+ 3 rows in set (0.00 sec)
Cách viết gọn hơn (MySQL 8.0+):
ORDER BY FIELD(Id, 109, 101, 110)
Hàm FIELD(str, str1, str2, ...) trả về vị trí của str trong danh sách (1-based), trả về 0 nếu không có. Rất tiện cho sắp xếp theo danh sách giá trị.
Ứng dụng: Hiển thị sản phẩm theo thứ tự ưu tiên, sắp xếp menu, kết quả tìm kiếm boosted.