Để sắp xếp theo cột ngày và cột số với quy tắc tùy chỉnh cho cột số, sử dụng ORDER BY CASE.
Cú pháp
SELECT * FROM ten_bang ORDER BY CASE ten_cot_so WHEN gia_tri_uu_tien THEN 1 ELSE 0 END DESC, ten_cot_ngay ASC;
Ví dụ minh họa
Tạo bảng đơn hàng với GroupId và ArrivalDate:
mysql> CREATE TABLE OrderByCaseDemo (
-> Id INT NOT NULL AUTO_INCREMENT,
-> GroupId INT,
-> ArrivalDate DATE,
-> PRIMARY KEY(Id)
-> );
mysql> INSERT INTO OrderByCaseDemo(GroupId, ArrivalDate) VALUES(2, '2019-02-06');
mysql> INSERT INTO OrderByCaseDemo(GroupId, ArrivalDate) VALUES(1, '2020-02-06');
mysql> INSERT INTO OrderByCaseDemo(GroupId, ArrivalDate) VALUES(3, '2018-02-06');
mysql> INSERT INTO OrderByCaseDemo(GroupId, ArrivalDate) VALUES(3, '2021-02-06');
mysql> INSERT INTO OrderByCaseDemo(GroupId, ArrivalDate) VALUES(2, '2017-02-06');
mysql> INSERT INTO OrderByCaseDemo(GroupId, ArrivalDate) VALUES(1, '2022-02-06');
Dữ liệu gốc:
+----+---------+-------------+ | Id | GroupId | ArrivalDate | +----+---------+-------------+ | 1 | 2 | 2019-02-06 | | 2 | 1 | 2020-02-06 | | 3 | 3 | 2018-02-06 | | 4 | 3 | 2021-02-06 | | 5 | 2 | 2017-02-06 | | 6 | 1 | 2022-02-06 | +----+---------+-------------+
Sắp xếp: GroupId=2 lên đầu, sau đó theo ArrivalDate tăng dần:
mysql> SELECT * FROM OrderByCaseDemo
-> ORDER BY CASE GroupId WHEN 2 THEN 1 ELSE 0 END DESC, ArrivalDate ASC;
Kết quả:
+----+---------+-------------+ | Id | GroupId | ArrivalDate | +----+---------+-------------+ | 5 | 2 | 2017-02-06 | | 1 | 2 | 2019-02-06 | | 3 | 3 | 2018-02-06 | | 2 | 1 | 2020-02-06 | | 4 | 3 | 2021-02-06 | | 6 | 1 | 2022-02-06 | +----+---------+-------------+
Nhóm GroupId=2 xuất hiện trước (sắp xếp theo ngày tăng), tiếp theo GroupId=3 và 1.