Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

จัดเรียงข้อมูลตามลำดับที่กำหนดเองด้วย ORDER BY FIELD() ใน MySQL


ปัญหาการจัดเรียงปกติ

คำสั่ง 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