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

จัดลำดับผลลัพธ์ตามลำดับค่าใน IN() ด้วย ORDER BY FIELD() ใน MySQL

บทนำ

คำสั่ง SELECT ... WHERE col IN (val1, val2, val3) ไม่รับประกันลำดับผลลัพธ์ ต้องการให้ผลลัพธ์อยู่ในลำดับเดียวกับใน IN() ใช้ ORDER BY FIELD()

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

mysql> CREATE TABLE DemoTable (
    -> Number INT
    -> );
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO DemoTable VALUES(19);
mysql> INSERT INTO DemoTable VALUES(30);
mysql> INSERT INTO DemoTable VALUES(34);
mysql> INSERT INTO DemoTable VALUES(28);
mysql> INSERT INTO DemoTable VALUES(25);
mysql> INSERT INTO DemoTable VALUES(29);
mysql> INSERT INTO DemoTable VALUES(24);

แสดงข้อมูลทั้งหมด (ลำดับสุ่ม/INSERT order)

mysql> SELECT * FROM DemoTable;

ผลลัพธ์

+--------+
| Number |
+--------+
| 19     |
| 30     |
| 34     |
| 28     |
| 25     |
| 29     |
| 24     |
+--------+
7 rows in set (0.00 sec)

คำสั่งเรียงตามลำดับใน IN()

mysql> SELECT * FROM DemoTable
    -> WHERE Number IN (30, 19, 34, 25, 28, 29, 24)
    -> ORDER BY FIELD(Number, 30, 19, 34, 25, 28, 29, 24);

ผลลัพธ์

+--------+
| Number |
+--------+
| 30     |
| 19     |
| 34     |
| 25     |
| 28     |
| 29     |
| 24     |
+--------+
7 rows in set (0.00 sec)

คำอธิบาย FIELD()

FIELD(str, val1, val2, val3, ...)
  • คืนค่าลำดับ (1-based index) ของ str ในรายการ val1, val2, ...
  • คืนค่า 0 หากไม่เจอ
  • ORDER BY FIELD(col, ...) จะเรียงตามลำดับที่ระบุใน FIELD()

การประยุกต์: เรียงตามสถานะ (Status) ที่กำหนดเอง

SELECT * FROM Orders
WHERE Status IN ('Pending', 'Processing', 'Shipped', 'Delivered', 'Cancelled')
ORDER BY FIELD(Status, 'Pending', 'Processing', 'Shipped', 'Delivered', 'Cancelled');

ข้อควรระวัง

  • FIELD() เป็นฟังก์ชันเฉพาะ MySQL (Non-standard)
  • ค่าที่ไม่อยู่ในรายการ FIELD() จะได้ 0 → จะอยู่ท้ายสุด (หาก ASC) หรือหน้าสุด (หาก DESC)
  • ประสิทธิภาพ: ไม่ใช้ Index ได้ ควรใช้กับ Result Set ที่เล็ก หรือรวมกับ WHERE IN()