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

Hàm FIELD() trong MySQL - Sắp xếp tùy chỉnh theo thứ tự mong muốn


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) = 1
  • FIELD(401, 101, 401, 1001, 1010) = 2
  • FIELD(1001, 101, 401, 1001, 1010) = 3
  • FIELD(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_order INT và index