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

Lấy kết quả MySQL theo đúng thứ tự của mảng IN() với ORDER BY FIELD()


Vấn đề

Mặc định WHERE Id IN (4,5,6) không đảm bảo thứ tự kết quả theo (4,5,6). Cần ORDER BY FIELD(Id, 4,5,6) để ép thứ tự.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(100)
);
mysql> INSERT INTO DemoTable (FirstName) VALUES 
('Chris'), ('Robert'), ('Mike'), ('Sam'), ('Carol'), ('David');

Xem dữ liệu (Id 1-6)

mysql> SELECT * FROM DemoTable;
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1  | Chris     |
| 2  | Robert    |
| 3  | Mike      |
| 4  | Sam       |
| 5  | Carol     |
| 6  | David     |
+----+-----------+

Truy vấn IN(4,5,6) + ORDER BY FIELD

mysql> SELECT FirstName FROM DemoTable 
WHERE Id IN (4,5,6) 
ORDER BY FIELD(Id, 4, 5, 6);

Kết quả (thứ tự 4,5,6)

+-----------+
| FirstName |
+-----------+
| Sam       |  -- Id 4
| Carol     |  -- Id 5
| David     |  -- Id 6
+-----------+

Giải thích FIELD()

  • FIELD(str, str1, str2, ...): Trả về vị trí (1-based) của str trong danh sách. Không tìm thấy → 0.
  • ORDER BY FIELD(Id, 4,5,6): Sắp xếp theo vị trí trong danh sách (4→1, 5→2, 6→3).
  • Giá trị không trong danh sách (nếu WHERE mở rộng) sẽ có FIELD=0 → lên đầu nếu ASC, xuống cuối nếu DESC.

Ứng dụng thực tế

  • Hiển thị sản phẩm theo thứ tự ưu tiên do admin cấu hình.
  • Sắp xếp theo danh sách ID từ frontend gửi lên.
  • Kết hợp với FIND_IN_SET cho chuỗi CSV: ORDER BY FIND_IN_SET(Id, '4,5,6').

Lưu ý hiệu năng

  • FIELD() không dùng index. Với bảng lớn, cân nhắc join với derived table/table-valued parameter.
  • MySQL 8.0: Có thể dùng VALUES ROW(4),(5),(6) JOIN.