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

MySQL: เรียงลำดับให้ค่าเฉพาะอยู่บนสุดด้วย ORDER BY ... DESC

เมื่อต้องการให้แถวที่มีค่าเฉพาะ (เช่น 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) หาไม่เจอ = 0
  • DESC ทำให้ค่าที่เจอ (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 BYORDER BY col = 'val' DESCหนึ่งค่าสำคัญ (Pin to top)
CASE WHENORDER BY CASE WHEN ... THEN 1 ... ENDหลายค่า หลายระดับ
FIELD()ORDER BY FIELD(col, 'v1', 'v2', ...)รายการค่าคงที่ MySQL only
ENUMกำหนด ENUM('v1','v2',...) แล้ว ORDER BY colSchema design (ถาวร)

เลือกเทคนิคตามความซับซ้อน: Boolean เรียบง่าย, CASE ยืดหยุ่น, FIELD สั้นกระชับ, ENUM ถาวร