ใช้ ORDER BY CASE เพื่อกำหนดลำดับความสำคัญของคอลัมน์ตัวเลข แล้วค่อยเรียงวันที่
ไวยากรณ์
SELECT * FROM yourTableName ORDER BY CASE yourIntegerColumn WHEN 2 THEN 1 ELSE 0 END DESC, yourDateColumn ASC;
ตัวอย่างการใช้งาน
สร้างตาราง:
mysql> create table OrderByCaseDemo (
-> Id int NOT NULL AUTO_INCREMENT,
-> GroupId int,
-> ArrivalDate date,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.57 sec)
เพิ่มข้อมูล:
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');
ข้อมูลเดิม:
+----+---------+-------------+ | 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 | +----+---------+-------------+
เรียง GroupId=2 ก่อน (THEN 1), อื่นๆ ทีหลัง (ELSE 0), แล้วเรียงวันที่น้อยไปมาก:
mysql> select * from OrderByCaseDemo
-> order by case GroupId when 2 then 1 else 0 end desc, ArrivalDate asc;
ผลลัพธ์:
+----+---------+-------------+ | 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 | +----+---------+-------------+
GroupId=2 อยู่บนสุด เรียงวันที่น้อยไปมาก ตามด้วย GroupId อื่นๆ