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_SETkhô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;