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

จัดเรียงด้วย ORDER BY FIELD() และ ID พร้อมกันใน MySQL


สถานการณ์

ต้องการจัดเรียงข้อมูลโดย: 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 ก่อน