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).
- Nếu 'Highest' → dùng
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 DESClàm khóa chính,CASElàm khóa phụ.