Sắp xếp nhóm dữ liệu theo thứ tự tùy ý với CASE WHEN và IN()
Khi cần sắp xếp không theo alphabet/number tự nhiên mà theo thứ tự nghiệp vụ tùy chỉnh, dùng ORDER BY CASE WHEN ... THEN sort_order END.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (Value VARCHAR(40));
mysql> INSERT INTO DemoTable VALUES
('John'), ('100&101'), ('Sam'), ('90'), ('Mike45');
2. Xem dữ liệu gốc
mysql> SELECT * FROM DemoTable;
+---------+ | Value | +---------+ | John | | 100&101 | | Sam | | 90 | | Mike45 | +---------+
3. Truy vấn: Sắp xếp nhóm ưu tiên: John, Sam, Mike45 → 90 → 100&101
mysql> SELECT * FROM DemoTable
ORDER BY CASE
WHEN Value IN ('John', 'Sam', 'Mike45') THEN 100
WHEN Value = '90' THEN 101
WHEN Value = '100&101' THEN 102
ELSE 103
END;
4. Kết quả
+---------+ | Value | +---------+ | John | | Sam | | Mike45 | | 90 | | 100&101 | +---------+
Giải thích:
- Nhóm 1 (ưu tiên cao): 'John', 'Sam', 'Mike45' → sort key = 100
- Nhóm 2: '90' → sort key = 101
- Nhóm 3: '100&101' → sort key = 102
- Khác: sort key = 103
- Sắp xếp tăng dần theo sort key → thứ tự mong muốn
Trong nhóm cùng sort key (100): Thứ tự không xác định (tuỳ engine). Thêm Value để ổn định:
ORDER BY CASE ... END, Value
Cách khác - JOIN với bảng mapping:
SELECT d.Value
FROM DemoTable d
JOIN (SELECT 'John' AS v, 1 AS ord UNION SELECT 'Sam',1 UNION SELECT 'Mike45',1
UNION SELECT '90',2 UNION SELECT '100&101',3) m ON d.Value = m.v
ORDER BY m.ord, d.Value;
Ứng dụng: Sắp xếp status (Pending→Processing→Done), priority (High→Medium→Low), category order tùy chỉnh.