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

Sắp xếp kết quả theo thứ tự trong mệnh đề IN MySQL?

Sắp xếp kết quả SELECT theo thứ tự giá trị trong mệnh đề IN

Mặc định MySQL không giữ thứ tự của danh sách trong IN(...). Sử dụng FIND_IN_SET() trong ORDER BY để ép kết quả theo thứ tự mong muốn.

Cú pháp

SELECT * FROM yourTable 
WHERE yourColumn IN (val1, val2, val3) 
ORDER BY FIND_IN_SET(yourColumn, 'val1,val2,val3');

Ví dụ: Sắp xếp EmployeeId theo thứ tự 100,10,20,50

Tạo bảng:

mysql> CREATE TABLE recordSetOrderDemo (
    -> EmployeeId INT,
    -> EmployeeName VARCHAR(30)
    -> );

Chèn dữ liệu:

mysql> INSERT INTO recordSetOrderDemo VALUES
(20, 'John'), (10, 'Larry'), (100, 'Mike'), (50, 'Sam'), (10, 'David');

Dữ liệu gốc:

+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| 20         | John         |
| 10         | Larry        |
| 100        | Mike         |
| 50         | Sam          |
| 10         | David        |
+------------+--------------+

Truy vấn IN có ORDER BY FIND_IN_SET:

mysql> SELECT * FROM recordSetOrderDemo 
WHERE EmployeeId IN (100, 10, 20, 50) 
ORDER BY FIND_IN_SET(EmployeeId, '100,10,20,50');

Kết quả theo đúng thứ tự 100,10,20,50:

+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
| 100        | Mike         |
| 10         | Larry        |
| 10         | David        |
| 20         | John         |
| 50         | Sam          |
+------------+--------------+

Giải thích FIND_IN_SET

  • FIND_IN_SET(str, strlist): Trả về vị trí (1-based) của str trong chuỗi strlist cách nhau bởi dấu phẩy
  • Không tìm thấy → trả về 0
  • NULL input → trả về NULL

Lưu ý hiệu năng

  • FIND_IN_SET không dùng index → full table scan trên tập kết quả IN
  • Phù hợp cho tập kết quả nhỏ (hàng trăm hàng)
  • Với tập lớn: cân nhắc JOIN với bảng tạm/derived table có cột sort_order

Cách thay thế (MySQL 8.0+)

SELECT * FROM recordSetOrderDemo 
WHERE EmployeeId IN (100, 10, 20, 50)
ORDER BY CASE EmployeeId 
    WHEN 100 THEN 1 WHEN 10 THEN 2 WHEN 20 THEN 3 WHEN 50 THEN 4 
    ELSE 5 END;