สถานการณ์
ต้องการจัดเรียงข้อมูลโดย: 1) นำ Name ที่ระบุ (เช่น 'Mike') มาก่อน 2) ส่วนที่เหลือจัดเรียงตาม Id จากมากไปน้อย (DESC)
วิธีแก้: ใช้ FIELD() ใน ORDER BY หลายระดับ
ORDER BY FIELD(Name, 'Mike') DESC, Id DESC
FIELD(Name, 'Mike')คืนค่า 1 หาเจอ, 0 หาไม่เจอDESCทำให้ 1 (เจอ) อยู่บน, 0 (ไม่เจอ) อยู่ล่าง- ระดับที่ 2:
Id DESCใช้จัดเรียงกลุ่มที่ไม่เจอ
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
-> Id INT,
-> Name VARCHAR(20)
-> );
Query OK, 0 rows affected (1.78 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable VALUES(101, 'Chris'); Query OK, 1 row affected (0.38 sec) mysql> INSERT INTO DemoTable VALUES(201, 'Mike'); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO DemoTable VALUES(110, 'Adam'); Query OK, 1 row affected (0.52 sec) mysql> INSERT INTO DemoTable VALUES(250, 'John'); Query OK, 1 row affected (0.33 sec)
3. จัดเรียง: Mike ก่อน, ที่เหลือ Id มากไปน้อย
mysql> SELECT * FROM DemoTable
-> ORDER BY FIELD(Name, 'Mike') DESC, Id DESC;
ผลลัพธ์:
+------+-------+ | Id | Name | +------+-------+ | 201 | Mike | | 250 | John | | 110 | Adam | | 101 | Chris | +------+-------+ 4 rows in set (0.01 sec)
รูปแบบทั่วไป
ORDER BY
FIELD(priority_column, 'high', 'medium', 'low') DESC, -- Priority ก่อน
created_at DESC, -- แล้วค่อยวันที่
id DESC -- แล้วค่อย ID
เทคนิคขั้นสูง: ใช้ CASE WHEN (ยืดหยุ่นกว่า)
ORDER BY
CASE
WHEN Name = 'Mike' THEN 1
WHEN Name = 'Admin' THEN 2
ELSE 3
END,
Id DESC;
กรณีการใช้งานจริง
- Dashboard: แสดงรายการสำคัญ (Pinned/Featured) ก่อน แล้วค่อยล่าสุด
- E-commerce: สินค้า Bestseller/On Sale ก่อน แล้วค่อยสินค้าอื่น
- Notification: Unread ก่อน Read, แล้วค่อยเรียงตามเวลา
- User List: Admin/Moderator ก่อน แล้วค่อย User ปกติ
ข้อควรระวัง
- FIELD() คืนค่า 0 หาไม่เจอ → ต้องใช้ DESC เพื่อให้ค่าที่เจอ (1) อยู่บน
- หลายค่าใน FIELD:
FIELD(col, 'A', 'B', 'C')คืน 1,2,3 ตามลำดับ - Case-sensitive ขึ้นกับ Collation
- ใช้ Index ไม่ได้ (Filesort) → ควรจำกัดข้อมูลด้วย WHERE/LIMIT ก่อน