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

เรียงลำดับวางค่าเฉพาะไว้ท้ายสุดใน MySQL ด้วย ORDER BY

เทคนิค: ใช้ 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