เมื่อต้องการให้แถวที่มีค่าเฉพาะ (เช่น Country = 'US') อยู่ บนสุด ใช้ ORDER BY column = 'value' DESC เพราะใน MySQL เงื่อนไขที่เป็นจริง (True) = 1, เท็จ (False) = 0 การเรียง DESC จะทำให้ 1 (True) อยู่ก่อน
รูปแบบคำสั่ง
SELECT * FROM table_name
ORDER BY column_name = 'target_value' DESC, id_column;
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE SortCertainValues (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(20),
CountryName VARCHAR(10),
PRIMARY KEY (Id)
);
INSERT INTO SortCertainValues (Name, CountryName) VALUES
('Adam', 'US'), ('John', 'UK'), ('Bob', 'US'),
('Carol', 'Denmark'), ('Sam', 'US'), ('David', 'France'),
('Maxwell', 'AUS'), ('Kevin', 'NewZealand');
ข้อมูลในตาราง:
+----+---------+-------------+
| Id | Name | CountryName |
+----+---------+-------------+
| 1 | Adam | US |
| 2 | John | UK |
| 3 | Bob | US |
| 4 | Carol | Denmark |
| 5 | Sam | US |
| 6 | David | France |
| 7 | Maxwell | AUS |
| 9 | Kevin | NewZealand |
+----+---------+-------------+
2. เรียงให้ Country = 'US' อยู่บนสุด
SELECT * FROM SortCertainValues
ORDER BY CountryName = 'US' DESC, Id;
ผลลัพธ์:
+----+---------+-------------+
| Id | Name | CountryName |
+----+---------+-------------+
| 1 | Adam | US |
| 3 | Bob | US |
| 5 | Sam | US |
| 2 | John | UK |
| 4 | Carol | Denmark |
| 6 | David | France |
| 7 | Maxwell | AUS |
| 9 | Kevin | NewZealand |
+----+---------+-------------+
แถวที่ CountryName = 'US' (True = 1) อยู่บนสุด แล้วตามด้วย Id ASC
ขยาย: เรียงหลายค่าตามลำดับสำคัญ
SELECT * FROM SortCertainValues
ORDER BY
CASE CountryName
WHEN 'US' THEN 1
WHEN 'UK' THEN 2
WHEN 'AUS' THEN 3
ELSE 4
END,
Id;
ผลลัพธ์: US ก่อน → UK → AUS → อื่นๆ ตาม Id
การใช้ FIELD() (MySQL Specific)
SELECT * FROM SortCertainValues
ORDER BY FIELD(CountryName, 'US', 'UK', 'AUS') DESC, Id;
FIELD(str, val1, val2, ...)- คืนตำแหน่ง (1-based) หาไม่เจอ = 0DESCทำให้ค่าที่เจอ (1,2,3) อยู่ก่อน 0 (ไม่เจอ)
ตัวอย่าง: เรียงสถานะออเดอร์ (Status Priority)
SELECT * FROM orders
ORDER BY FIELD(status, 'pending', 'processing', 'shipped', 'delivered', 'cancelled'),
created_at;
สถานะตามลำดับความสำคัญ: pending → processing → shipped → delivered → cancelled
สรุปเทคนิค
| เทคนิค | รูปแบบ | เหมาะสำหรับ |
|---|---|---|
| Boolean ORDER BY | ORDER BY col = 'val' DESC | หนึ่งค่าสำคัญ (Pin to top) |
| CASE WHEN | ORDER BY CASE WHEN ... THEN 1 ... END | หลายค่า หลายระดับ |
| FIELD() | ORDER BY FIELD(col, 'v1', 'v2', ...) | รายการค่าคงที่ MySQL only |
| ENUM | กำหนด ENUM('v1','v2',...) แล้ว ORDER BY col | Schema design (ถาวร) |
เลือกเทคนิคตามความซับซ้อน: Boolean เรียบง่าย, CASE ยืดหยุ่น, FIELD สั้นกระชับ, ENUM ถาวร