Chức năng
FIELD(str, val1, val2, val3, ...) trả về vị trí (index) của str trong danh sách giá trị. Trả về 0 nếu không tìm thấy.
Cú pháp sắp xếp tùy chỉnh
SELECT * FROM ten_bang ORDER BY FIELD(ten_cot, gia_tri_1, gia_tri_2, gia_tri_3, ...) DESC;
Ví dụ: Sắp xếp StudentId theo thứ tự 101, 401, 1001, 1010
1. Tạo bảng
mysql> CREATE TABLE OrderByDemo ( -> StudentId INT -> ); Query OK, 0 rows affected (0.71 sec)
2. Chèn dữ liệu
mysql> INSERT INTO OrderByDemo VALUES(101); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO OrderByDemo VALUES(1010); Query OK, 1 row affected (0.56 sec) mysql> INSERT INTO OrderByDemo VALUES(1001); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO OrderByDemo VALUES(401); Query OK, 1 row affected (0.12 sec)
3. Dữ liệu gốc (theo thứ tự insert)
mysql> SELECT * FROM OrderByDemo;
+-----------+ | StudentId | +-----------+ | 101 | | 1010 | | 1001 | | 401 | +-----------+ 4 rows in set (0.00 sec)
4. Sắp xếp theo FIELD() DESC
mysql> SELECT * FROM OrderByDemo -> ORDER BY FIELD(StudentId, 101, 401, 1001, 1010) DESC;
+-----------+ | StudentId | +-----------+ | 1010 | | 1001 | | 401 | | 101 | +-----------+ 4 rows in set (0.00 sec)
Giải thích cơ chế
FIELD(101, 101, 401, 1001, 1010)= 1FIELD(401, 101, 401, 1001, 1010)= 2FIELD(1001, 101, 401, 1001, 1010)= 3FIELD(1010, 101, 401, 1001, 1010)= 4- Sắp xếp
DESC: 4, 3, 2, 1 → 1010, 1001, 401, 101
Ứng dụng thực tế
Sắp xếp trạng thái theo quy trình nghiệp vụ
SELECT * FROM orders ORDER BY FIELD(status, 'pending', 'processing', 'shipped', 'delivered', 'cancelled');
Ưu tiên hiển thị sản phẩm nổi bật
SELECT * FROM products ORDER BY FIELD(category_id, 5, 1, 3, 2, 4), created_at DESC;
Xử lý giá trị không trong danh sách (ra cuối)
SELECT * FROM ten_bang
ORDER BY
CASE WHEN FIELD(cot, 'A', 'B', 'C') = 0 THEN 1 ELSE 0 END,
FIELD(cot, 'A', 'B', 'C') DESC;
Lưu ý hiệu năng
FIELD()không sử dụng index → Full table scan- Chỉ dùng cho bảng nhỏ/vừa hoặc kết hợp LIMIT
- Bảng lớn: Cân nhắc thêm cột
sort_orderINT và index