Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ORDER BY: 3 เดือนล่าสุดก่อน แล้วค่อยเรียง A-Z ใน MySQL

เรียงลำดับแบบผสม: ใกล้ปัจจุบันก่อน (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-08
  • PurchaseDate > '2019-07-08' → TRUE (1) สำหรับ Bob, David
  • ORDER 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;