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

Tìm ID duy nhất từ bản ghi trùng lặp với điều kiện loại trừ bằng NOT IN trong MySQL


Vấn đề

Tìm các Id xuất hiện trong bảng nhưng **không** có bản ghi nào đi kèm FirstName = 'Chris'.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (Id INT, FirstName VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES 
(100, 'Chris'), (100, 'Robert'), (100, 'Mike'), (100, 'Sam'),
(101, 'David'), (101, 'Robert'),
(210, 'Chris'), (210, 'Bob'), (210, 'Sam');

Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+------+-----------+
| Id   | FirstName |
+------+-----------+
| 100  | Chris     |
| 100  | Robert    |
| 100  | Mike      |
| 100  | Sam       |
| 101  | David     |
| 101  | Robert    |
| 210  | Chris     |
| 210  | Bob       |
| 210  | Sam       |
+------+-----------+

Truy vấn: Id không có FirstName='Chris'

mysql> SELECT DISTINCT Id FROM DemoTable 
WHERE Id NOT IN (SELECT Id FROM DemoTable WHERE FirstName = 'Chris');

Kết quả

+------+
| Id   |
+------+
| 101  |
+------+

Giải thích

  • Subquery: SELECT Id FROM DemoTable WHERE FirstName = 'Chris' → trả về (100, 210).
  • Main query: Lấy Id không nằm trong (100, 210) → chỉ còn 101.
  • DISTINCT loại trùng Id trong kết quả.

⚠️ Cảnh báo NOT IN với NULL

Nếu subquery trả về NULL (ví dụ FirstName=NULL cho một Id), NOT IN sẽ không trả về kết quả nào (vì NULL so sánh = UNKNOWN).

An toàn hơn: NOT EXISTS

SELECT DISTINCT Id FROM DemoTable d1
WHERE NOT EXISTS (
    SELECT 1 FROM DemoTable d2 
    WHERE d2.Id = d1.Id AND d2.FirstName = 'Chris'
);

Mở rộng: LEFT JOIN / IS NULL

SELECT DISTINCT d1.Id 
FROM DemoTable d1
LEFT JOIN (SELECT DISTINCT Id FROM DemoTable WHERE FirstName = 'Chris') d2 
  ON d1.Id = d2.Id
WHERE d2.Id IS NULL;