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

Sắp xếp nhóm (ORDER BY) theo thứ tự tùy chỉnh với CASE WHEN IN MySQL

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.