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

Sắp xếp MySQL: ưu tiên giá trị cụ thể, phần còn lại ORDER BY ngày

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.