การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1884 (Marks INT);
mysql> INSERT INTO DemoTable1884 VALUES(55), (97), (79), (87);
Query: ใช้ OR กับ ORDER BY FIELD
mysql> SELECT * FROM DemoTable1884
WHERE Marks = 98 OR Marks = 87
ORDER BY FIELD(Marks, 98, 87)
LIMIT 1;
ผลลัพธ์ (มีแค่ 87, 98 ไม่มีในตาราง):
+-------+
| Marks |
+-------+
| 87 |
+-------+
ฟังก์ชัน FIELD()
FIELD(str, str1, str2, str3, ...)
-- คืนค่า Index (1-based) ของ str ใน List
-- คืนค่า 0 ถ้าไม่พบ
การทำงานของ ORDER BY FIELD
- เรียงตามลำดับที่ระบุใน FIELD: 98 ก่อน, 87 ต่อไป
- ค่าที่ไม่ได้ระบุใน FIELD จะได้ 0 → อยู่หน้าสุด (ถ้า ASC)
- ร่วมกับ WHERE จำกัด Scope ให้เหลือเฉพาะค่าที่ต้องการ
ตัวอย่างเพิ่มเติม
-- เรียงสถานะตามลำดับความสำคัญ
SELECT * FROM orders
ORDER BY FIELD(status, 'urgent', 'high', 'normal', 'low');
-- ใช้กับ CASE (ยืดหยุ่นกว่า)
SELECT * FROM DemoTable1884
WHERE Marks IN (98, 87)
ORDER BY CASE Marks WHEN 98 THEN 1 WHEN 87 THEN 2 ELSE 3 END
LIMIT 1;
กรณีใช้งานจริง
- Custom Sort Order ที่ไม่ใช่ Alphabetical/Numeric
- Priority Queue: Urgent > High > Normal > Low
- Status Workflow: Pending → Processing → Shipped → Delivered
- Enum Display Order
ข้อควรระวัง
FIELD()คืนค่า 0 ถ้าไม่เจอ → จะอยู่บนสุดใน ASC- ใช้
FIELD() DESCถ้าต้องการค่าที่ไม่เจออยู่ท้าย - Performance: FIELD() ไม่ใช้ Index ได้