Khi dùng WHERE id IN (...), MySQL không giữ thứ tự giá trị trong danh sách IN. Dùng ORDER BY FIELD() để sáp xết kết quả theo đúng thứ tự bạn muốn.
Cú pháp
SELECT *
FROM ten_bang
WHERE cot IN (gt1, gt2, ..., gtn)
ORDER BY FIELD(cot, gt1, gt2, ..., gtn);
Ví dụ minh họa
Tạo bảng SelectOrderbyField:
CREATE TABLE SelectOrderbyField (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(30),
Age INT,
PRIMARY KEY (Id)
);
INSERT INTO SelectOrderbyField (Name, Age) VALUES
('John',23), ('Carol',25), ('Bob',21),
('Mike',28), ('Sam',26), ('David',23);
1. Sắp xếp theo Id theo thứ tự tùy chỉnh
SELECT *
FROM SelectOrderbyField
WHERE Id IN (5,1,3,2,6,4)
ORDER BY FIELD(Id, 5,1,3,2,6,4);
+----+-------+------+
| Id | Name | Age |
+----+-------+------+
| 5 | Sam | 26 |
| 1 | John | 23 |
| 3 | Bob | 21 |
| 2 | Carol | 25 |
| 6 | David | 23 |
| 4 | Mike | 28 |
+----+-------+------+
2. Sắp xếp theo Name theo thứ tự tùy chỉnh
SELECT *
FROM SelectOrderbyField
WHERE Name IN ('Sam','John','Bob','Carol','David','Mike')
ORDER BY FIELD(Name, 'Sam','John','Bob','Carol','David','Mike');
+----+-------+------+
| Id | Name | Age |
+----+-------+------+
| 5 | Sam | 26 |
| 1 | John | 23 |
| 3 | Bob | 21 |
| 2 | Carol | 25 |
| 6 | David | 23 |
| 4 | Mike | 28 |
+----+-------+------+
Lưu ý: FIELD() trả về 0 nếu giá trị không có trong danh sách – các hàng không khớp sẽ lên đầu nếu không có WHERE IN.