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

Sắp xếp theo thứ tự giá trị cụ thể trong MySQL với ORDER BY FIELD()

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.