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

เรียงลำดับตามเงื่อนไขใน MySQL ด้วย ORDER BY CASE WHEN

หลักการ: ORDER BY CASE WHEN

ใช้ CASE WHEN ภายใน ORDER BY เพื่อกำหนดลำดับแสดงผลแบบกำหนดเอง (Custom Sort Order)

ไวยากรณ์

SELECT * FROM yourTable
ORDER BY CASE 
    WHEN condition1 THEN sort_value1
    WHEN condition2 THEN sort_value2
    ...
    ELSE default_sort_value
END;

ตัวอย่าง: ตาราง demo51

CREATE TABLE demo51 (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20)
);

INSERT INTO demo51 (name) VALUES
('John'), ('Bob'), ('David'), ('Sam');

ข้อมูล

+----+-------+
| id | name  |
+----+-------+
| 1  | John  |
| 2  | Bob   |
| 3  | David |
| 4  | Sam   |
+----+-------+

คำสั่ง: เรียง John ก่อน, ตามด้วย Bob, David, Sam ท้ายสุด

SELECT * FROM demo51
ORDER BY CASE
    WHEN name = 'John'  THEN 110
    WHEN name = 'Bob'   THEN 105
    WHEN name = 'David' THEN 104
    ELSE 101
END;

ผลลัพธ์

+----+-------+
| id | name  |
+----+-------+
| 4  | Sam   |  -- ELSE 101 (น้อยที่สุด)
| 3  | David |  -- 104
| 2  | Bob   |  -- 105
| 1  | John  |  -- 110 (มากที่สุด → มาก่อน)
+----+-------+

หมายเหตุ: ORDER BY เรียงจากน้อยไปมาก (ASC) ดังนั้นค่า CASE ที่มากกว่า จะอยู่บน

กรณีศึกษาเพิ่มเติม

1. เรียงสถานะออเดอร์: Pending → Processing → Shipped → Delivered → Cancelled

ORDER BY CASE status
    WHEN 'Pending'    THEN 1
    WHEN 'Processing' THEN 2
    WHEN 'Shipped'    THEN 3
    WHEN 'Delivered'  THEN 4
    WHEN 'Cancelled'  THEN 5
    ELSE 6
END

2. เรียงตามหลายเงื่อนไข (Priority + Date)

ORDER BY 
    CASE WHEN priority = 'High' THEN 1
         WHEN priority = 'Medium' THEN 2
         ELSE 3 END,
    created_at ASC

3. ใส่ NULL ไว้ท้าย

ORDER BY 
    CASE WHEN column IS NULL THEN 1 ELSE 0 END,
    column ASC

เคล็ดลับ

  • ตัวเลขใน THEN เป็นเพียง "น้ำหนัก" สำหรับเรียง — ไม่ต้องเป็น 1,2,3... ใช้ 100, 200, 300 ก็ได้
  • รวมกับคอลัมน์อื่นได้: ORDER BY CASE ..., created_at DESC
  • ใช้กับ ENUM ได้โดยตรง: ORDER BY FIELD(status, 'Pending','Processing','Shipped') (MySQL specific)

ฟังก์ชัน FIELD() — ทางเลือกที่ง่ายกว่า

ORDER BY FIELD(name, 'John', 'Bob', 'David', 'Sam')

คืนค่าตำแหน่งในลิสต์ (1,2,3,4) ไม่พบ = 0 → เรียง 0 ก่อน (Sam จะอยู่บน) ต้องระวัง