Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sắp xếp: 3 tháng gần đây trước, sau đó theo tên trong MySQL

Để ưu tiên hiển thị các bản ghi trong **3 tháng gần đây** (tính từ ngày hiện tại) lên đầu, tiếp theo là các bản ghi cũ hơn sắp xếp theo tên, hãy dùng biểu thức logic trong ORDER BY.

Kỹ thuật: ORDER BY bieu_thuc_logic DESC, cot_khac

Biểu thức PurchaseDate > CURDATE() - INTERVAL 3 MONTH trả về 1 (TRUE) cho 3 tháng gần, 0 (FALSE) cho cũ hơn. Sắp xếp DESC đưa TRUE (1) lên đầu.

Ví dụ minh họa

Tạo bảng mua hàng:

mysql> CREATE TABLE DemoTable1526 (
    -> CustomerName VARCHAR(20),
    -> PurchaseDate DATE
    -> );
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');

Giả sử hôm nay 2019-10-08. 3 tháng gần = từ 2019-07-08.

Truy vấn:

mysql> SELECT * FROM DemoTable1526
    -> ORDER BY PurchaseDate > CURDATE() - INTERVAL 3 MONTH DESC, CustomerName;

Kết quả:

+--------------+--------------+
| CustomerName | PurchaseDate |
+--------------+--------------+
| Bob          | 2019-12-31   |  -- > 3 tháng (TRUE=1) → lên đầu, sort by name
| David        | 2019-10-10   |  -- > 3 tháng (TRUE=1)
| Adam         | 2019-06-01   |  -- ≤ 3 tháng (FALSE=0) → sau, sort by name
| Chris        | 2019-05-24   |
| Sam          | 2019-04-26   |
+--------------+--------------+

Giải thích

  • PurchaseDate > '2019-07-08': Bob (12-31), David (10-10) → TRUE (1).
  • ORDER BY ... DESC: TRUE (1) > FALSE (0) → nhóm gần ngày lên đầu.
  • Trong cùng nhóm TRUE: sắp xếp theo CustomerName (Adam, Bob, Chris, David, Sam).

Mở rộng

  • Thêm cột hiển thị nhóm: SELECT *, IF(PurchaseDate > CURDATE() - INTERVAL 3 MONTH, 'Gần đây', 'Cũ') AS Nhom ...
  • Dùng CASE trong ORDER BY cho nhiều mức ưu tiên: ORDER BY CASE WHEN ... THEN 1 WHEN ... THEN 2 ELSE 3 END, CustomerName.
  • Index trên (PurchaseDate, CustomerName) hỗ trợ sắp xếp nhanh.