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

วิธีจัดเรียง ORDER BY แบบกำหนดเอง บางค่า DESC บางค่า ASC ใน MySQL

จัดเรียงค่าเฉพาะก่อน ด้วย FIELD() แล้วค่าอื่นตามปกติ

ฟังก์ชัน FIELD(str, val1, val2, ...) คืนค่าตำแหน่งของ str ในรายการ (1-based) หรือ 0 ถ้าไม่เจอ ใช้ใน ORDER BY เพื่อกำหนดลำดับพิเศษให้ค่าบางค่า

ตัวอย่างสร้างตารางและข้อมูล

CREATE TABLE DemoTable (Value INT);
INSERT INTO DemoTable VALUES (10), (70), (60), (56), (81), (85);

ข้อมูลก่อนจัดเรียง

+-------+
| Value |
+-------+
| 10    |
| 70    |
| 60    |
| 56    |
| 81    |
| 85    |
+-------+

คำสั่งจัดเรียง: ให้ 60, 70, 81 อยู่บนสุด (DESC) แล้วค่าอื่น ASC

SELECT * FROM DemoTable 
ORDER BY FIELD(Value, 60, 70, 81) DESC;

ผลลัพธ์

+-------+
| Value |
+-------+
| 81    |
| 70    |
| 60    |
| 10    |
| 56    |
| 85    |
+-------+

คำอธิบาย:

  • FIELD(Value, 60, 70, 81) คืนค่า: 81→3, 70→2, 60→1, อื่นๆ→0
  • DESC เรียง 3,2,1,0 → 81, 70, 60 อยู่บนสุดตามลำดับใน FIELD()
  • ค่าที่ไม่ในลิสต์ (FIELD=0) จะอยู่ท้าย และเรียงตามค่าเริ่มต้น (ไม่ได้ระบุ ASC/DESC ต่อ → Default ASC)

กรณีต้องการ: ค่าพิเศษ DESC, ค่าอื่น ASC ชัดเจน

ORDER BY 
    CASE WHEN Value IN (60,70,81) THEN 0 ELSE 1 END,  -- กลุ่มพิเศษก่อน
    CASE WHEN Value IN (60,70,81) THEN Value END DESC, -- ในกลุ่มพิเศษ เรียง DESC
    CASE WHEN Value NOT IN (60,70,81) THEN Value END ASC; -- กลุ่มอื่น เรียง ASC

ประยุกต์ใช้: จัดอันดับสินค้า/บทความ: Featured ก่อน, แล้วค่าอื่นตามปกติ