เรียงลำดับแบบผสม: ใกล้ปัจจุบันก่อน (3 เดือน) แล้วค่อย A-Z
ใช้ Boolean Expression ใน ORDER BY: PurchaseDate > CURDATE() - INTERVAL 3 MONTH คืนค่า 1 (TRUE) หรือ 0 (FALSE) เรียง DESC จะได้ TRUE (1) ก่อน → 3 เดือนล่าสุดอยู่บน
สร้างตารางและข้อมูล (วันที่ 2019)
mysql> CREATE TABLE DemoTable1526 (
-> CustomerName VARCHAR(20),
-> PurchaseDate DATE
-> );
Query OK, 0 rows affected (0.67 sec)
mysql> INSERT INTO DemoTable1526 VALUES
-> ('Adam', '2019-06-01'), ('Sam', '2019-04-26'), ('Chris', '2019-05-24'),
-> ('David', '2019-10-10'), ('Bob', '2019-12-31');
Query OK, 5 rows affected
วันที่ปัจจุบัน (สมมติ)
mysql> SELECT CURDATE(); +------------+ | curdate() | +------------+ | 2019-10-08 | +------------+
คำสั่ง: 3 เดือนล่าสุดก่อน (DESC) แล้ว CustomerName (ASC)
mysql> SELECT * FROM DemoTable1526
-> ORDER BY PurchaseDate > CURDATE() - INTERVAL 3 MONTH DESC, CustomerName;
ผลลัพธ์
+--------------+--------------+ | CustomerName | PurchaseDate | +--------------+--------------+ | Bob | 2019-12-31 | -- ใน 3 เดือน (Oct 8 - Jan 8) → TRUE (1) → บนสุด | David | 2019-10-10 | -- ใน 3 เดือน → TRUE (1) → บนสุด | Adam | 2019-06-01 | -- นอก 3 เดือน → FALSE (0) → เรียง A-Z | Chris | 2019-05-24 | -- นอก 3 เดือน → FALSE (0) → เรียง A-Z | Sam | 2019-04-26 | -- นอก 3 เดือน → FALSE (0) → เรียง A-Z +--------------+--------------+
คำอธิบายตรรกะ
CURDATE() - INTERVAL 3 MONTH= 2019-07-08PurchaseDate > '2019-07-08'→ TRUE (1) สำหรับ Bob, DavidORDER BY ... DESC→ TRUE (1) อยู่บน, FALSE (0) อยู่ล่าง- ในกลุ่ม FALSE เรียง
CustomerName ASC(Default)
รูปแบบอื่น: ใช้ CASE WHEN (ชัดเจนกว่า)
ORDER BY
CASE WHEN PurchaseDate > CURDATE() - INTERVAL 3 MONTH THEN 0 ELSE 1 END,
CustomerName;
ประยุกต์: หลายระดับ Priority
ORDER BY
CASE
WHEN PurchaseDate > CURDATE() - INTERVAL 1 MONTH THEN 1 -- เดือนนี้: Priority 1
WHEN PurchaseDate > CURDATE() - INTERVAL 3 MONTH THEN 2 -- 3 เดือน: Priority 2
ELSE 3 -- เก่า: Priority 3
END,
CustomerName;