Vấn đề: ORDER BY tùy chỉnh – một giá trị lên đầu, phần còn lại sắp xếp theo cột khác
Cần hiển thị user 'David' trước, các user khác sắp xếp theo ShippingDate tăng dần.
Giải pháp: ORDER BY biểu thức boolean + cột thứ hai
Biểu thức UserName = 'David' trả về 1 (true) hoặc 0 (false). DESC đưa 1 lên đầu. Khóa phụ: ShippingDate ASC.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
UserName VARCHAR(20),
ShippingDate DATE
);
INSERT INTO DemoTable VALUES
('Chris', '2018-10-12'),
('David', '2019-04-11'),
('Mike', '2016-12-04'),
('Carol', '2017-12-26');
2. Truy vấn
SELECT * FROM DemoTable
ORDER BY UserName = 'David' DESC, ShippingDate;
3. Kết quả
+----------+--------------+
| UserName | ShippingDate |
+----------+--------------+
| David | 2019-04-11 |
| Mike | 2016-12-04 |
| Carol | 2017-12-26 |
| Chris | 2018-10-12 |
+----------+--------------+
Giải thích
UserName = 'David'→ 1 cho David, 0 cho người khác.DESC→ 1 (David) trước, 0 (người khác) sau.- Nhóm 0 (người khác) sắp xếp theo
ShippingDate ASC.
Mở rộng: Ưu tiên nhiều giá trị theo thứ tự
ORDER BY CASE UserName
WHEN 'David' THEN 1
WHEN 'Chris' THEN 2
ELSE 3
END, ShippingDate;
David đầu, Chris thứ hai, các user khác theo ngày.
Lưu ý
- Kỹ thuật này không dùng được chỉ mục cho sắp xếp – full scan + filesort.
- Với bảng lớn, cân nhắc thêm cột
priority INT, index trên(priority, ShippingDate), cập nhật priority khi cần.