คำสั่ง WHERE id IN (...) ไม่รับประกันลำดับผลลัพธ์ ใช้ ORDER BY FIND_IN_SET() เพื่อกำหนดลำดับตามที่ต้องการ
รูปแบบคำสั่ง
SELECT * FROM yourTableName WHERE yourColumnName IN (val1,val2,val3) ORDER BY FIND_IN_SET(yourColumnName, 'val1,val2,val3');
ตัวอย่าง
1. สร้างตารางและข้อมูล
mysql> create table FindInSetDemo (Id int, Name varchar(20), Age int);
mysql> insert into FindInSetDemo values
-> (10,'John',23),(1,'Carol',21),(4,'Bob',25),(6,'Sam',26),
-> (7,'Maxwell',29),(8,'Mike',22),(2,'David',27),(3,'James',20);
2. Query ด้วย IN (ลำดับไม่ถูกต้อง)
mysql> select * from FindInSetDemo where Id IN (1,4,6,7);
+------+---------+------+ | Id | Name | Age | +------+---------+------+ | 1 | Carol | 21 | | 4 | Bob | 25 | | 6 | Sam | 26 | | 7 | Maxwell | 29 | +------+---------+------+
3. Query ด้วย FIND_IN_SET (ลำดับถูกต้อง: 1,4,6,7)
mysql> select * from FindInSetDemo
-> where Id IN (1,4,6,7)
-> order by FIND_IN_SET(Id, '1,4,6,7');
+------+---------+------+ | Id | Name | Age | +------+---------+------+ | 1 | Carol | 21 | | 4 | Bob | 25 | | 6 | Sam | 26 | | 7 | Maxwell | 29 | +------+---------+------+
เทคนิคอื่น: ใช้ FIELD()
SELECT * FROM FindInSetDemo WHERE Id IN (1,4,6,7) ORDER BY FIELD(Id, 1,4,6,7);
FIELD() เร็วกว่า FIND_IN_SET() เพราะไม่ต้องแปลงสตริง
MySQL 8.0+ ใช้ VALUES() กับ CTE
WITH ordered_ids AS (
SELECT 1 AS id, 1 AS ord UNION ALL
SELECT 4, 2 UNION ALL
SELECT 6, 3 UNION ALL
SELECT 7, 4
)
SELECT f.* FROM FindInSetDemo f
JOIN ordered_ids o ON f.Id = o.id
ORDER BY o.ord;
กรณีค่ามาจาก Subquery
SELECT * FROM yourTable WHERE id IN (SELECT id FROM otherTable WHERE condition) ORDER BY FIELD(id, (SELECT GROUP_CONCAT(id ORDER BY sort_col) FROM otherTable WHERE condition));