Giải pháp: ORDER BY FIELD()
Hàm FIELD(str, val1, val2, ...) trả về vị trí 1-based của str trong danh sách, hoặc 0 nếu không có. Dùng để sắp xếp theo thứ tự tùy ý.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (Number INT); mysql> INSERT INTO DemoTable VALUES(1), (4), (2), (3);
Dữ liệu gốc
+--------+ | Number | +--------+ | 1 | | 4 | | 2 | | 3 | +--------+
Truy vấn: Thứ tự 4, 2, 1, 3
mysql> SELECT * FROM DemoTable ORDER BY FIELD(Number, 4, 2, 1, 3);
Kết quả
+--------+ | Number | +--------+ | 4 | <-- FIELD=1 | 2 | <-- FIELD=2 | 1 | <-- FIELD=3 | 3 | <-- FIELD=4 +--------+
Giải thích FIELD()
FIELD(4, 4,2,1,3) = 1FIELD(2, 4,2,1,3) = 2FIELD(1, 4,2,1,3) = 3FIELD(3, 4,2,1,3) = 4FIELD(5, 4,2,1,3) = 0(giá trị khác) → xếp cuối mặc định
Xử lý giá trị không trong danh sách
-- Xếp cuối (mặc định FIELD=0, ASC) ORDER BY FIELD(Number, 4,2,1,3) -- Xếp đầu ORDER BY FIELD(Number, 4,2,1,3) DESC -- Tách riêng: trong danh sách trước, ngoài sau ORDER BY (FIELD(Number, 4,2,1,3) = 0) ASC, FIELD(Number, 4,2,1,3) ASC
So sánh FIELD vs CASE
| Phương pháp | Ví dụ | Ưu điểm |
|---|---|---|
| FIELD() | ORDER BY FIELD(col, 4,2,1,3) | Ngắn, đọc dễ, danh sách giá trị |
| CASE | ORDER BY CASE col WHEN 4 THEN 1 WHEN 2 THEN 2... | Linh hoạt điều kiện phức tạp |
| FIND_IN_SET | ORDER BY FIND_IN_SET(col, '4,2,1,3') | Chuỗi CSV, chậm hơn |
Ứng dụng thực tế
Sắp xếp status workflow
ORDER BY FIELD(status, 'draft', 'review', 'approved', 'published', 'archived')
Sắp xếp size
ORDER BY FIELD(size, 'XS', 'S', 'M', 'L', 'XL', 'XXL')
Sắp xếp priority
ORDER BY FIELD(priority, 'critical', 'high', 'medium', 'low')
Lưu ý
- FIELD() chỉ hoạt động với giá trị rời rạc (không phải range)
- Không dùng index cho ORDER BY FIELD()
- Bảng lớn: Thêm cột
sort_order INTpre-computed