คอลัมน์ ENUM ใน MySQL จะเรียงลำดับตามลำดับที่กำหนดใน Definition (Index 1,2,3...) ไม่ใช่ตามตัวอักษร หากต้องการเรียงตามลำดับที่กำหนดเอง (Custom Order) ใช้ ORDER BY CASE WHEN
ตัวอย่างการใช้งาน
สร้างตาราง ENUM บัตรไพ่ (ลำดับ Default: K, J, A, Q):
mysql> CREATE TABLE DemoTable1461 (
-> DeckOfCards ENUM('K','J','A','Q')
-> );
เพิ่มข้อมูล:
mysql> INSERT INTO DemoTable1461 VALUES ('K'), ('A'), ('J'), ('Q');
ดูข้อมูล (เรียงตาม ENUM Index: K=1, J=2, A=3, Q=4):
mysql> SELECT * FROM DemoTable1461; +-------------+ | DeckOfCards | +-------------+ | K | | A | | J | | Q | +-------------+
เรียงตามลำดับที่กำหนดเอง (A, K, Q, J):
mysql> SELECT * FROM DemoTable1461
-> ORDER BY CASE DeckOfCards
-> WHEN 'A' THEN 100
-> WHEN 'K' THEN 101
-> WHEN 'Q' THEN 102
-> ELSE 103
-> END;
ผลลัพธ์:
+-------------+ | DeckOfCards | +-------------+ | A | | K | | Q | | J | +-------------+
วิธีทางเลือกอื่นๆ
| วิธี | ตัวอย่าง | คำอธิบาย |
|---|---|---|
| CASE WHEN | ORDER BY CASE col WHEN 'A' THEN 1 WHEN 'B' THEN 2 ELSE 3 END | ยืดหยุ่นที่สุด รองรับทุกชนิดข้อมูล |
| FIELD() | ORDER BY FIELD(DeckOfCards, 'A', 'K', 'Q', 'J') | MySQL Specific สั้นกว่า คืนค่า Index (1-based) หรือ 0 หาไม่เจอ |
| FIND_IN_SET | ORDER BY FIND_IN_SET(DeckOfCards, 'A,K,Q,J') | ใช้กับ CSV String คล้าย FIELD |
| CAST to CHAR | ORDER BY CAST(DeckOfCards AS CHAR) | เรียงตามตัวอักษร (A, J, K, Q) ไม่ใช่ ENUM Index |
ข้อควรระวังเกี่ยวกับ ENUM
- ENUM เรียงตาม Index ตำแหน่ง ไม่ใช่ค่าตัวอักษร (K=1, J=2, A=3, Q=4)
- การ INSERT ค่าที่ไม่อยู่ใน ENUM จะได้ Warning + Empty String ('')
- ALTER TABLE เพิ่มค่า ENUM ใหม่ ต้องระบุลำดับที่ถูกต้อง
- ENUM ใช้พื้นที่เก็บข้อมูลน้อย (1-2 Bytes) แต่ยากต่อการแก้ไขค่า/ลำดับ
แนวทางแทน ENUM (Modern Approach)
- Lookup Table: สร้างตารางอ้างอิง (cards: id, name, sort_order) + Foreign Key
- CHECK Constraint (MySQL 8.0.16+):
CHECK (card IN ('A','K','Q','J')) - Generated Column สำหรับ Sort Order