Sắp xếp tùy chỉnh với CASE trong ORDER BY MySQL
Kết hợp sắp xếp theo cột số và ưu tiên giá trị cụ thể của cột văn bản bằng CASE.
Tạo bảng và dữ liệu
mysql> create table DemoTable1610 (
Marks int,
Name varchar(20)
);
Query OK, 0 rows affected (0.51 sec)
mysql> insert into DemoTable1610 values(85,'John'); mysql> insert into DemoTable1610 values(78,'Carol'); mysql> insert into DemoTable1610 values(78,'John'); mysql> insert into DemoTable1610 values(85,'Carol');
Dữ liệu gốc
+-------+-------+ | Marks | Name | +-------+-------+ | 85 | John | | 78 | Carol | | 78 | John | | 85 | Carol | +-------+-------+
Truy vấn: Sắp xếp Marks tăng, nhưng Carol lên trước John khi Marks bằng nhau
mysql> select * from DemoTable1610
-> order by Marks, case when Name='Carol' then 1 else 0 end;
Kết quả
+-------+-------+ | Marks | Name | +-------+-------+ | 78 | John | | 78 | Carol | | 85 | John | | 85 | Carol | +-------+-------+
Phân tích:
- Sắp xếp chính:
Marks ASC(78 trước 85) - Sắp xếp phụ:
CASE WHEN Name='Carol' THEN 1 ELSE 0 END - Với Marks=78: John (0) trước Carol (1) → John lên trước
- Với Marks=85: John (0) trước Carol (1) → John lên trước
Điều chỉnh: Muốn Carol lên trước → đổi THEN 0 ELSE 1 hoặc dùng DESC cho CASE.
Cách thay thế: ORDER BY Marks, FIELD(Name, 'Carol', 'John') (Carol=1, John=2 → Carol lên trước).