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

กำหนดลำดับเฉพาะกับ WHERE id IN (...) ใน MySQL

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

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

SELECT * FROM yourTableName 
WHERE yourColumnName IN (val1,val2,val3) 
ORDER BY FIND_IN_SET(yourColumnName, 'val1,val2,val3');

ตัวอย่าง

1. สร้างตารางและข้อมูล

mysql> create table FindInSetDemo (Id int, Name varchar(20), Age int);
mysql> insert into FindInSetDemo values 
    -> (10,'John',23),(1,'Carol',21),(4,'Bob',25),(6,'Sam',26),
    -> (7,'Maxwell',29),(8,'Mike',22),(2,'David',27),(3,'James',20);

2. Query ด้วย IN (ลำดับไม่ถูกต้อง)

mysql> select * from FindInSetDemo where Id IN (1,4,6,7);
+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
| 1    | Carol   | 21   |
| 4    | Bob     | 25   |
| 6    | Sam     | 26   |
| 7    | Maxwell | 29   |
+------+---------+------+

3. Query ด้วย FIND_IN_SET (ลำดับถูกต้อง: 1,4,6,7)

mysql> select * from FindInSetDemo 
    -> where Id IN (1,4,6,7) 
    -> order by FIND_IN_SET(Id, '1,4,6,7');
+------+---------+------+
| Id   | Name    | Age  |
+------+---------+------+
| 1    | Carol   | 21   |
| 4    | Bob     | 25   |
| 6    | Sam     | 26   |
| 7    | Maxwell | 29   |
+------+---------+------+

เทคนิคอื่น: ใช้ FIELD()

SELECT * FROM FindInSetDemo 
WHERE Id IN (1,4,6,7) 
ORDER BY FIELD(Id, 1,4,6,7);

FIELD() เร็วกว่า FIND_IN_SET() เพราะไม่ต้องแปลงสตริง

MySQL 8.0+ ใช้ VALUES() กับ CTE

WITH ordered_ids AS (
    SELECT 1 AS id, 1 AS ord UNION ALL
    SELECT 4, 2 UNION ALL
    SELECT 6, 3 UNION ALL
    SELECT 7, 4
)
SELECT f.* FROM FindInSetDemo f
JOIN ordered_ids o ON f.Id = o.id
ORDER BY o.ord;

กรณีค่ามาจาก Subquery

SELECT * FROM yourTable
WHERE id IN (SELECT id FROM otherTable WHERE condition)
ORDER BY FIELD(id, (SELECT GROUP_CONCAT(id ORDER BY sort_col) FROM otherTable WHERE condition));