Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chọn giá trị theo thứ tự tùy chỉnh từ cột khác trong MySQL với một truy vấn

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ảoDanh 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