คำสั่ง IN ใน MySQL ไม่รับประกันลำดับผลลัพธ์ ต้องใช้ฟังก์ชัน FIELD() ใน ORDER BY เพื่อบังคับให้เรียงตามลำดับที่ระบุใน IN
รูปแบบคำสั่ง
SELECT * FROM yourTableName
WHERE yourColumnName IN (value1, value2, ..., valueN)
ORDER BY FIELD(yourColumnName, value1, value2, ..., valueN);
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE OrderInDemo (
-> Id INT,
-> Name VARCHAR(100),
-> Age INT
-> );
Query OK, 0 rows affected (1.24 sec)
mysql> INSERT INTO OrderInDemo VALUES
-> (90, 'David', 23), (9, 'Sam', 24), (10, 'Carol', 19),
-> (1, 'John', 26), (3, 'Johnson', 25), (2, 'Ramit', 20);
2. ดูข้อมูลทั้งหมด (ลำดับตาม PK)
mysql> SELECT * FROM OrderInDemo;
+------+---------+------+
| Id | Name | Age |
+------+---------+------+
| 90 | David | 23 |
| 9 | Sam | 24 |
| 10 | Carol | 19 |
| 1 | John | 26 |
| 3 | Johnson | 25 |
| 2 | Ramit | 20 |
+------+---------+------+
6 rows in set (0.00 sec)
3. Query ด้วย IN โดยไม่มี ORDER BY FIELD
mysql> SELECT * FROM OrderInDemo WHERE Id IN (10, 1, 3);
+------+---------+------+
| Id | Name | Age |
+------+---------+------+
| 10 | Carol | 19 |
| 1 | John | 26 |
| 3 | Johnson | 25 |
+------+---------+------+
3 rows in set (0.00 sec)
ผลลัพธ์อาจไม่เรียงตาม 10, 1, 3 (ขึ้นอยู่กับ Execution Plan)
4. ใช้ ORDER BY FIELD บังคับลำดับ
mysql> SELECT * FROM OrderInDemo
-> WHERE Id IN (10, 1, 3)
-> ORDER BY FIELD(Id, 10, 1, 3);
+------+---------+------+
| Id | Name | Age |
+------+---------+------+
| 10 | Carol | 19 |
| 1 | John | 26 |
| 3 | Johnson | 25 |
+------+---------+------+
3 rows in set (0.00 sec)
ตอนนี้เรียงตาม 10 → 1 → 3 ตามที่ระบุ
FIELD() ทำงานอย่างไร
FIELD(str, str1, str2, str3, ...)
-- คืนค่า Index (1-based) ของ str ที่ตรงกับ str1, str2, ...
-- คืนค่า 0 หาไม่เจอ
mysql> SELECT FIELD('b', 'a', 'b', 'c'); -- คืนค่า 2
mysql> SELECT FIELD('x', 'a', 'b', 'c'); -- คืนค่า 0
กรณีใช้งานจริง
- แสดงสินค้าตามลำดับที่ผู้ใช้เลือก (Wishlist, Compare)
- รายงานที่ต้องเรียงตามลำดับธุรกิจเฉพาะ (Priority: High, Medium, Low)
- Union หลาย Query ที่ต้องคงลำดับ
ข้อควรระวัง
FIELD()ทำงานกับ String และ Number ได้ (Number จะแปลงเป็น String ก่อนเปรียบเทียบ)- หากค่าใน IN ไม่อยู่ใน FIELD() จะได้ 0 และขึ้นก่อนเสมอ (เพราะ 0 < 1)
- ประสิทธิภาพ: ใช้ Index ของคอลัมน์ IN ได้ปกติ แต่ ORDER BY FIELD ต้อง Sort เพิ่ม