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ố định, phần còn lại sắp xếp theo tiêu chí khác

Vấn đề: ORDER BY phức tạp – ưu tiên nhóm, trong nhóm sắp xếp ngẫu nhiên/khác

Cần hiển thị các hàng có Position = 'Lowest' trước (sắp xếp theo Number tăng), sau đó các hàng Position = 'Highest' (sắp xếp ngẫu nhiên).

Giải pháp: ORDER BY CASE với RAND()

Dùng CASE trong ORDER BY để định nghĩa logic sắp xếp tùy chỉnh.

1. Tạo bảng và dữ liệu

CREATE TABLE DemoTable (
    Position VARCHAR(20),
    Number INT
);

INSERT INTO DemoTable VALUES
('Highest', 50), ('Highest', 30),
('Lowest', 100), ('Lowest', 120), ('Lowest', 90);

2. Truy vấn sắp xếp tùy chỉnh

SELECT * FROM DemoTable
ORDER BY Position DESC,
         CASE Position 
             WHEN 'Highest' THEN RAND() 
             ELSE Number 
         END ASC;

3. Giải thích

  • Position DESC – 'Lowest' (L) > 'Highest' (H) theo alphabet → 'Lowest' lên đầu.
  • Trong cùng nhóm Position:
    • Nếu 'Highest' → dùng RAND() (sắp xếp ngẫu nhiên).
    • Nếu 'Lowest' → dùng Number (sắp xếp tăng dần).

4. Kết quả mẫu (Highest ngẫu nhiên)

+----------+--------+
| Position | Number |
+----------+--------+
| Lowest   |     90 |
| Lowest   |    100 |
| Lowest   |    120 |
| Highest  |     50 |
| Highest  |     30 |
+----------+--------+

Lưu ý

  • RAND() tính lại cho mỗi hàng → thứ tự 'Highest' khác nhau mỗi lần chạy.
  • Hiệu suất: ORDER BY CASE ... RAND() không dùng được chỉ mục, chậm trên bảng lớn.
  • Cần xác định rõ logic: ví dụ trên dùng Position DESC làm khóa chính, CASE làm khóa phụ.