Lấy giá trị theo thứ tự tùy chỉnh với IN() trong MySQL
Sử dụng mệnh đề WHERE ... IN(...) kết hợp thứ tự các giá trị trong ngoặc để lấy bản ghi theo thứ tự mong muốn (MySQL thường giữ thứ tự của IN() khi không có ORDER BY).
Ví dụ minh họa
Tạo bảng DemoTable727:
mysql> CREATE TABLE DemoTable727 (
Name VARCHAR(100),
Score INT
);
Query OK, 0 rows affected (0.88 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable727 VALUES('Chris', 45);
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable727 VALUES('Robert', 89);
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable727 VALUES('Carol', 94);
Query OK, 1 row affected (0.22 sec)
mysql> INSERT INTO DemoTable727 VALUES('David', 93);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable727 VALUES('Mike', 78);
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO DemoTable727 VALUES('Sam', 67);
Query OK, 1 row affected (0.22 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable727;
+--------+-------+ | Name | Score | +--------+-------+ | Chris | 45 | | Robert | 89 | | Carol | 94 | | David | 93 | | Mike | 78 | | Sam | 67 | +--------+-------+ 6 rows in set (0.00 sec)
Lấy Score theo thứ tự tùy chỉnh: Robert → David → Sam:
mysql> SELECT Score FROM DemoTable727 WHERE Name IN('Robert', 'David', 'Sam');
Kết quả (thường theo thứ tự IN):
+-------+ | Score | +-------+ | 89 | | 93 | | 67 | +-------+ 3 rows in set (0.00 sec)
⚠️ Lưu ý quan trọng về thứ tự
MySQL không đảm bảo thứ tự kết quả khớp với thứ tự trong IN() nếu không có ORDER BY. Để đảm bảo thứ tự tuyệt đối:
Cách 1: ORDER BY FIELD() (Khuyên dùng)
SELECT Score FROM DemoTable727
WHERE Name IN('Robert', 'David', 'Sam')
ORDER BY FIELD(Name, 'Robert', 'David', 'Sam');
Cách 2: CASE WHEN trong ORDER BY
SELECT Score FROM DemoTable727
WHERE Name IN('Robert', 'David', 'Sam')
ORDER BY CASE Name
WHEN 'Robert' THEN 1
WHEN 'David' THEN 2
WHEN 'Sam' THEN 3
ELSE 4 END;
Cách 3: JOIN với bảng thứ tự (tốt cho danh sách dài/dynamic)
SELECT d.Score
FROM DemoTable727 d
JOIN (
SELECT 'Robert' AS Name, 1 AS sort_order
UNION ALL SELECT 'David', 2
UNION ALL SELECT 'Sam', 3
) o ON d.Name = o.Name
ORDER BY o.sort_order;
So sánh
| Phương pháp | Đảm bảo thứ tự | Phù hợp |
|---|---|---|
| IN() seul | ❌ Không đảm bảo | Danh sách ngắn, không quan tâm thứ tự |
| ORDER BY FIELD() | ✅ Có | Danh sách tĩnh, ngắn-gọn |
| ORDER BY CASE | ✅ Có | Logic phức tạp |
| JOIN bảng thứ tự | ✅ Có | Danh sách động, dài, từ bảng khác |