การจัดเรียงข้อมูลตามลำดับที่กำหนดเอง (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