เทคนิค: ใช้ Boolean Expression ใน ORDER BY
MySQL แปลง Boolean เป็นตัวเลข: TRUE = 1, FALSE = 0
นำมาใช้จัดลำดับ: ค่า FALSE (0) จะอยู่ก่อน, TRUE (1) อยู่หลัง
ไวยากรณ์
SELECT * FROM yourTable ORDER BY (column = 'specific_value'), column ASC|DESC;
ตัวอย่าง: ตาราง demo57
CREATE TABLE demo57 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
full_name VARCHAR(20)
);
INSERT INTO demo57 (full_name) VALUES
('John Smith'), ('David Miller'), ('Not Known'), ('Chris Brown');
ข้อมูล
+----+--------------+ | id | full_name | +----+--------------+ | 1 | John Smith | | 2 | David Miller | | 3 | Not Known | | 4 | Chris Brown | +----+--------------+
คำสั่ง: วาง "Not Known" ไว้ท้าย เรียงชื่ออื่น Z-A
SELECT * FROM demo57 ORDER BY (full_name = "Not Known"), full_name DESC;
ผลลัพธ์
+----+--------------+ | id | full_name | +----+--------------+ | 1 | John Smith | | 2 | David Miller | | 4 | Chris Brown | | 3 | Not Known | +----+--------------+
คำอธิบาย
(full_name = "Not Known")คืน 0 สำหรับชื่ออื่น, 1 สำหรับ "Not Known"ORDER BY 0, name DESC→ เรียง name DESC ก่อน (Z-A)ORDER BY 1, name DESC→ "Not Known" ถูกวางหลังกลุ่ม 0
รูปแบบอื่นๆ
1. วางค่าเฉพาะไว้หน้า (TOP)
ORDER BY (full_name = "VIP Customer") DESC, full_name ASC;
DESC กลับกลุ่ม: TRUE (1) อยู่หน้า, FALSE (0) อยู่หลัง
2. หลายค่า: วาง "Unknown" และ "N/A" ท้าย
ORDER BY
CASE
WHEN full_name IN ('Not Known', 'N/A', 'Unknown') THEN 1
ELSE 0
END,
full_name ASC;
3. ใช้ FIELD() (MySQL Specific)
ORDER BY FIELD(full_name, 'Not Known', 'N/A'), full_name;
FIELD คืนตำแหน่ง (1,2...) ไม่พบ = 0 → 0 อยู่หน้า (ดีกว่า CASE สำหรับหลายค่า)
ประสิทธิภาพ
- Boolean expression ใน ORDER BY ไม่ใช้ INDEX ได้สำหรับการเรียง
- ตารางเล็ก (< 10k rows): ไม่มีปัญหา
- ตารางใหญ่: เพิ่มคอลัมน์
sort_order INTคำนวณไว้ตอน INSERT/UPDATE แล้ว INDEX
สรุปเทคนิคการเรียงลำดับพิเศษ
| เป้าหมาย | ORDER BY Clause |
|---|---|
| วางค่า X ท้าย | (col = 'X'), col ASC |
| วางค่า X หน้า | (col = 'X') DESC, col ASC |
| วางหลายค่าท้าย | CASE WHEN col IN (...) THEN 1 ELSE 0 END, col ASC |
| ลำดับกำหนดเอง | FIELD(col, 'A','B','C'), col |
| NULL ท้าย | (col IS NULL), col ASC |