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

MySQL ORDER BY FIELD ใช้ CASE Statement จัดลำดับกำหนดเอง

จัดลำดับข้อมูลตามลำดับที่กำหนดเองด้วย CASE

เมื่อต้องการเรียงข้อมูลไม่ใช่ตาม Alphabet หรือ Numeric Order แต่มาจากลำดับที่เรากำหนดเอง (Custom Sort Order) ให้ใช้ CASE ใน ORDER BY clause

ตัวอย่าง: จัดลำดับ StudentId ตามลำดับที่ต้องการ

CREATE TABLE DemoTable(StudentId VARCHAR(100));

INSERT INTO DemoTable VALUES('STU-980'), ('STU-1029'), ('STU-189'), ('STU-890');

Query เรียงตามลำดับ: STU-890, STU-1029, STU-980, STU-189

SELECT * FROM DemoTable
ORDER BY CASE 
    WHEN StudentId = 'STU-890'  THEN 1
    WHEN StudentId = 'STU-1029' THEN 2
    WHEN StudentId = 'STU-980'  THEN 3
    WHEN StudentId = 'STU-189'  THEN 4
    ELSE 5
END;

ผลลัพธ์:

+-----------+
| StudentId |
+-----------+
| STU-890   |
| STU-1029  |
| STU-980   |
| STU-189   |
+-----------+

วิธีทางเลือก: ใช้ FIELD() Function (MySQL Specific)

-- ใช้ FIELD() สั้นกว่า และอ่านง่ายกว่า
SELECT * FROM DemoTable
ORDER BY FIELD(StudentId, 'STU-890', 'STU-1029', 'STU-980', 'STU-189');

FIELD(str, val1, val2, ...) คืนค่า Index (1-based) ของ str ในรายการ ถ้าไม่เจอคืน 0 (จะอยู่ท้ายสุด)

เปรียบเทียบ CASE vs FIELD()

คุณสมบัติCASEFIELD()
ความยืดหยุ่นสูง (เขียนเงื่อนไขซับซ้อนได้)ต่ำ (แค่ Match ค่าเท่านั้น)
รองรับ Range/Conditionได้ (เช่น WHEN age > 18)ไม่ได้
Performanceคล้ายกันคล้ายกัน
PortabilityANSI SQL (รองรับ DB อื่น)MySQL Only

Best Practice

  • ใช้ FIELD() สำหรับรายการค่าคงที่ (Enum-like values)
  • ใช้ CASE สำหรับ Logic ซับซ้อน Range, Multiple Conditions
  • เพิ่ม ELSE 999 ใน CASE เพื่อจัดการค่าที่ไม่ได้กำหนด ให้อยู่ท้ายสุด