ปัญหาการจัดเรียงปกติ
คำสั่ง ORDER BY ปกติจะจัดเรียงตามลำดับอักษร (A-Z) หรือตัวเลข (น้อยไปมาก) แต่บางครั้งต้องการจัดเรียงตามลำดับธุรกิจที่กำหนดเอง เช่น ตำแหน่งงาน, ระดับความสำคัญ, สถานะออเดอร์
วิธีแก้: ใช้ FIELD()
ฟังก์ชัน FIELD(str, val1, val2, val3, ...) คืนค่าตำแหน่งของ str ในรายการ (1-based) คืนค่า 0 หาไม่เจอ ใช้ร่วมกับ ORDER BY ได้ลำดับที่ต้องการ
ตัวอย่างการใช้งาน
1. สร้างตารางตำแหน่งงาน
mysql> CREATE TABLE DemoTable (
-> Designation VARCHAR(100)
-> );
Query OK, 0 rows affected (1.65 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable VALUES('Software Engineer');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable VALUES('Associate Software Engineer');
Query OK, 1 row affected (0.25 sec)
mysql> INSERT INTO DemoTable VALUES('Software Development Engineer');
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO DemoTable VALUES('Product Manager');
Query OK, 1 row affected (0.17 sec)
3. จัดเรียงตามระดับตำแหน่ง (Junior → Senior → Manager)
mysql> SELECT * FROM DemoTable
-> ORDER BY FIELD(Designation,
-> 'Associate Software Engineer',
-> 'Software Engineer',
-> 'Software Development Engineer',
-> 'Product Manager'
-> );
ผลลัพธ์:
+-------------------------------+ | Designation | +-------------------------------+ | Associate Software Engineer | | Software Engineer | | Software Development Engineer | | Product Manager | +-------------------------------+ 4 rows in set (0.02 sec)
เทคนิคเพิ่มเติม
รวมกับการจัดเรียงรอง (Secondary Sort)
ORDER BY FIELD(status, 'pending', 'processing', 'shipped', 'delivered'),
created_at DESC
จัดการค่าที่ไม่อยู่ในรายการ (ไว้ท้ายสุด)
ORDER BY CASE
WHEN status IN ('pending','processing') THEN 1
WHEN status IN ('shipped','delivered') THEN 2
ELSE 3
END, created_at
กรณีการใช้งานจริง
- สถานะออเดอร์: Pending → Confirmed → Shipped → Delivered → Cancelled
- ระดับความเสี่ยง: Critical → High → Medium → Low
- ประเภทสมาชิก: VIP → Premium → Standard → Free
- วันในสัปดาห์: Monday → Tuesday → ... → Sunday
ข้อควรระวัง
- ค่าที่ไม่อยู่ใน FIELD() จะได้ 0 → จะอยู่บนสุด (ASC) หรือท้ายสุด (DESC)
- Case-sensitive ตาม Collation ของตาราง
- รายการยาวมากอาจส่งผลต่อ Performance