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

การ ORDER BY คอลัมน์ ENUM ตามเงื่อนไขกำหนดเองใน MySQL

คอลัมน์ 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 WHENORDER 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_SETORDER BY FIND_IN_SET(DeckOfCards, 'A,K,Q,J')ใช้กับ CSV String คล้าย FIELD
CAST to CHARORDER 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