Để ư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
CASEtrong 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.