บทนำ
คำสั่ง SELECT ... WHERE col IN (val1, val2, val3) ไม่รับประกันลำดับผลลัพธ์ ต้องการให้ผลลัพธ์อยู่ในลำดับเดียวกับใน IN() ใช้ ORDER BY FIELD()
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> Number INT
-> );
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO DemoTable VALUES(19);
mysql> INSERT INTO DemoTable VALUES(30);
mysql> INSERT INTO DemoTable VALUES(34);
mysql> INSERT INTO DemoTable VALUES(28);
mysql> INSERT INTO DemoTable VALUES(25);
mysql> INSERT INTO DemoTable VALUES(29);
mysql> INSERT INTO DemoTable VALUES(24);
แสดงข้อมูลทั้งหมด (ลำดับสุ่ม/INSERT order)
mysql> SELECT * FROM DemoTable;
ผลลัพธ์
+--------+
| Number |
+--------+
| 19 |
| 30 |
| 34 |
| 28 |
| 25 |
| 29 |
| 24 |
+--------+
7 rows in set (0.00 sec)
คำสั่งเรียงตามลำดับใน IN()
mysql> SELECT * FROM DemoTable
-> WHERE Number IN (30, 19, 34, 25, 28, 29, 24)
-> ORDER BY FIELD(Number, 30, 19, 34, 25, 28, 29, 24);
ผลลัพธ์
+--------+
| Number |
+--------+
| 30 |
| 19 |
| 34 |
| 25 |
| 28 |
| 29 |
| 24 |
+--------+
7 rows in set (0.00 sec)
คำอธิบาย FIELD()
FIELD(str, val1, val2, val3, ...)
- คืนค่าลำดับ (1-based index) ของ str ในรายการ val1, val2, ...
- คืนค่า 0 หากไม่เจอ
ORDER BY FIELD(col, ...)จะเรียงตามลำดับที่ระบุใน FIELD()
การประยุกต์: เรียงตามสถานะ (Status) ที่กำหนดเอง
SELECT * FROM Orders
WHERE Status IN ('Pending', 'Processing', 'Shipped', 'Delivered', 'Cancelled')
ORDER BY FIELD(Status, 'Pending', 'Processing', 'Shipped', 'Delivered', 'Cancelled');
ข้อควรระวัง
- FIELD() เป็นฟังก์ชันเฉพาะ MySQL (Non-standard)
- ค่าที่ไม่อยู่ในรายการ FIELD() จะได้ 0 → จะอยู่ท้ายสุด (หาก ASC) หรือหน้าสุด (หาก DESC)
- ประสิทธิภาพ: ไม่ใช้ Index ได้ ควรใช้กับ Result Set ที่เล็ก หรือรวมกับ WHERE IN()