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

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

การจัดเรียงข้อมูลตามลำดับที่กำหนดเอง (Custom Sort Order)

ใช้ ORDER BY FIELD(column, 'val1', 'val2', 'val3', ...) เพื่อกำหนดลำดับการแสดงผลที่ไม่ใช่ Alphabetical หรือ Numeric

Syntax

SELECT * FROM table_name ORDER BY FIELD(column_name, 'value1', 'value2', 'value3') [ASC|DESC];

ตัวอย่าง: เรียงภาษาโปรแกรมตามลำดับ MongoDB, C, Python, Java

สร้างตารางและเพิ่มข้อมูล:

mysql> CREATE TABLE DemoTable (Title VARCHAR(100));
Query OK, 0 rows affected (0.56 sec)

mysql> INSERT INTO DemoTable VALUES ('Java'), ('C'), ('Python'), ('MongoDB');
Query OK, 4 rows affected

ข้อมูลต้นฉบับ:

mysql> SELECT * FROM DemoTable;
+---------+
| Title   |
+---------+
| Java    |
| C       |
| Python  |
| MongoDB |
+---------+
4 rows in set (0.00 sec)

เรียงตามลำดับที่กำหนด: MongoDB, C, Python, Java:

mysql> SELECT * FROM DemoTable 
ORDER BY FIELD(Title, 'MongoDB', 'C', 'Python', 'Java') ASC;
+---------+
| Title   |
+---------+
| MongoDB |
| C       |
| Python  |
| Java    |
+---------+
4 rows in set (0.00 sec)

รายละเอียด FIELD()

  • คืนค่า **Index (1-based)** ของค่าใน List
  • ค่าที่ **ไม่อยู่ใน List** จะได้ 0 → จะอยู่ **บนสุด** หาก ASC
  • ใช้ได้กับ String และ Number
  • Case Sensitivity ขึ้นกับ Collation ของ Column

กรณี: ค่าที่ไม่อยู่ใน List อยู่ล่างสุด

ORDER BY CASE 
    WHEN Title IN ('MongoDB','C','Python','Java') THEN FIELD(Title, 'MongoDB','C','Python','Java')
    ELSE 999999 
END;

วิธีอื่น: JOIN กับ Mapping Table (แนะนำสำหรับ Production)

CREATE TABLE sort_order (Title VARCHAR(100) PRIMARY KEY, SortOrder INT);
INSERT INTO sort_order VALUES ('MongoDB',1), ('C',2), ('Python',3), ('Java',4);

SELECT t.* FROM DemoTable t
LEFT JOIN sort_order s ON t.Title = s.Title
ORDER BY COALESCE(s.SortOrder, 999999);

ประสิทธิภาพ

  • FIELD() ทำให้ **ไม่ใช้ Index** (Filesort)
  • ตารางเล็ก (< 1000 rows) ใช้ได้ไม่มีปัญหา
  • ตารางใหญ่ → ใช้ Mapping Table + JOIN + Index