Giới thiệu
Hàm FIELD(str, val1, val2, val3, ...) trả về vị trí (1-based) của str trong danh sách giá trị. Kết hợp với ORDER BY FIELD(...) để sắp xếp theo thứ tự tùy chỉnh hoàn toàn.
Ví dụ thực hành
1. Tạo bảng DemoTable849
mysql> CREATE TABLE DemoTable849 (Color VARCHAR(100));
2. Chèn dữ liệu
mysql> INSERT INTO DemoTable849 VALUES ('RED'),('ORANGE'),('BLUE'),('GREEN');
3. Sắp xếp: RED → GREEN → BLUE → ORANGE
mysql> SELECT * FROM DemoTable849
ORDER BY FIELD(Color, 'RED', 'GREEN', 'BLUE', 'ORANGE');
4. Kết quả
+--------+
| Color |
+--------+
| RED |
| GREEN |
| BLUE |
| ORANGE |
+--------+
Cơ chế hoạt động
FIELD('RED', 'RED','GREEN','BLUE','ORANGE')= 1.FIELD('GREEN', ...)= 2.- Giá trị không có trong danh sách → trả về 0 → được sắp xếp ĐẦU TIÊN (vì 0 < 1).
Đẩy giá trị không có trong danh sách xuống cuối
ORDER BY CASE WHEN FIELD(Color, 'RED','GREEN','BLUE','ORANGE') = 0 THEN 1 ELSE 0 END,
FIELD(Color, 'RED','GREEN','BLUE','ORANGE');
So sánh với CASE WHEN
-- Tương đương FIELD
ORDER BY CASE Color
WHEN 'RED' THEN 1
WHEN 'GREEN' THEN 2
WHEN 'BLUE' THEN 3
WHEN 'ORANGE' THEN 4
ELSE 5 END;
FIELD() ngắn gọn hơn cho danh sách giá trị rời rạc.
Lưu ý
FIELD()phân biệt chữ hoa/thường theo collation của cột.- Có thể dùng với số:
FIELD(status, 3,1,2,0). - Hiệu suất: Tốt cho danh sách ngắn. Danh sách dài → cân nhắc bảng mapping (lookup table) + JOIN.