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

จัดลำดับผลลัพธ์ตามลำดับใน IN Clause ด้วย FIELD()

คำสั่ง IN ใน MySQL ไม่รับประกันลำดับผลลัพธ์ ต้องใช้ฟังก์ชัน FIELD() ใน ORDER BY เพื่อบังคับให้เรียงตามลำดับที่ระบุใน IN

รูปแบบคำสั่ง

SELECT * FROM yourTableName 
WHERE yourColumnName IN (value1, value2, ..., valueN)
ORDER BY FIELD(yourColumnName, value1, value2, ..., valueN);

ตัวอย่างการใช้งาน

1. สร้างตารางและเพิ่มข้อมูล

mysql> CREATE TABLE OrderInDemo (
    -> Id INT,
    -> Name VARCHAR(100),
    -> Age INT
    -> );
Query OK, 0 rows affected (1.24 sec)

mysql> INSERT INTO OrderInDemo VALUES 
    -> (90, 'David', 23), (9, 'Sam', 24), (10, 'Carol', 19),
    -> (1, 'John', 26), (3, 'Johnson', 25), (2, 'Ramit', 20);

2. ดูข้อมูลทั้งหมด (ลำดับตาม PK)

mysql> SELECT * FROM OrderInDemo;
+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
| 90   | David   | 23   |
| 9    | Sam     | 24   |
| 10   | Carol   | 19   |
| 1    | John    | 26   |
| 3    | Johnson | 25   |
| 2    | Ramit   | 20   |
+------+---------+------+
6 rows in set (0.00 sec)

3. Query ด้วย IN โดยไม่มี ORDER BY FIELD

mysql> SELECT * FROM OrderInDemo WHERE Id IN (10, 1, 3);
+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
| 10   | Carol   | 19   |
| 1    | John    | 26   |
| 3    | Johnson | 25   |
+------+---------+------+
3 rows in set (0.00 sec)

ผลลัพธ์อาจไม่เรียงตาม 10, 1, 3 (ขึ้นอยู่กับ Execution Plan)

4. ใช้ ORDER BY FIELD บังคับลำดับ

mysql> SELECT * FROM OrderInDemo 
    -> WHERE Id IN (10, 1, 3)
    -> ORDER BY FIELD(Id, 10, 1, 3);
+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
| 10   | Carol   | 19   |
| 1    | John    | 26   |
| 3    | Johnson | 25   |
+------+---------+------+
3 rows in set (0.00 sec)

ตอนนี้เรียงตาม 10 → 1 → 3 ตามที่ระบุ

FIELD() ทำงานอย่างไร

FIELD(str, str1, str2, str3, ...)
-- คืนค่า Index (1-based) ของ str ที่ตรงกับ str1, str2, ...
-- คืนค่า 0 หาไม่เจอ
mysql> SELECT FIELD('b', 'a', 'b', 'c');  -- คืนค่า 2
mysql> SELECT FIELD('x', 'a', 'b', 'c');  -- คืนค่า 0

กรณีใช้งานจริง

  • แสดงสินค้าตามลำดับที่ผู้ใช้เลือก (Wishlist, Compare)
  • รายงานที่ต้องเรียงตามลำดับธุรกิจเฉพาะ (Priority: High, Medium, Low)
  • Union หลาย Query ที่ต้องคงลำดับ

ข้อควรระวัง

  • FIELD() ทำงานกับ String และ Number ได้ (Number จะแปลงเป็น String ก่อนเปรียบเทียบ)
  • หากค่าใน IN ไม่อยู่ใน FIELD() จะได้ 0 และขึ้นก่อนเสมอ (เพราะ 0 < 1)
  • ประสิทธิภาพ: ใช้ Index ของคอลัมน์ IN ได้ปกติ แต่ ORDER BY FIELD ต้อง Sort เพิ่ม