ORDER BY ตามลำดับใน IN ด้วย FIND_IN_SET()
คำสั่ง IN ไม่รับประกันลำดับ ใช้ FIND_IN_SET() เพื่อจัดเรียงตามตำแหน่งในรายการ
ตัวอย่าง
CREATE TABLE recordSetOrderDemo (
EmployeeId INT, EmployeeName VARCHAR(30)
);
INSERT INTO recordSetOrderDemo VALUES
(20, 'John'), (10, 'Larry'), (100, 'Mike'), (50, 'Sam'), (10, 'David');
Query ปกติ (ลำดับไม่แน่นอน)
SELECT * FROM recordSetOrderDemo WHERE EmployeeId IN (100, 10, 20, 50);
Query เรียงตาม IN List
SELECT * FROM recordSetOrderDemo WHERE EmployeeId IN (100, 10, 20, 50) ORDER BY FIND_IN_SET(EmployeeId, '100,10,20,50');
ผลลัพธ์
+------------+--------------+ | EmployeeId | EmployeeName | +------------+--------------+ | 100 | Mike | | 10 | Larry | | 10 | David | | 20 | John | | 50 | Sam | +------------+--------------+
คำอธิบาย
FIND_IN_SET(str, strlist)คืนตำแหน่ง (1-based) ของ str ใน strlist- strlist ต้องเป็นสตริงคั่นด้วยคอมม่า ไม่มีช่องว่าง
- ค่าที่ไม่อยู่ใน List จะได้ 0 (จะอยู่บนสุดถ้า ASC)
MySQL 8.0+ ใช้ FIELD()
ORDER BY FIELD(EmployeeId, 100, 10, 20, 50)
FIELD() เร็วกว่าและรองรับตัวเลขโดยตรง ไม่ต้องเป็น String