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

Dùng JOIN tìm bản ghi thỏa 2 điều kiện AND trên cùng cột (Self-JOIN)

Bài toán

Tìm PersonName có **cả** 'Banana' **và** 'Apple' trong cột PersonFavouriteFruit (mỗi dòng chỉ 1 fruit).

Giải pháp: Self-JOIN

SELECT tbl1.PersonName 
FROM bang tbl1 
JOIN bang tbl2 ON tbl1.PersonName = tbl2.PersonName 
WHERE tbl1.PersonFavouriteFruit = 'Banana' 
  AND tbl2.PersonFavouriteFruit = 'Apple';

Ví dụ: Bảng selectPerson (10 dòng)

Dữ liệu

+----------+------------+----------------------+
| PersonId | PersonName | PersonFavouriteFruit |
+----------+------------+----------------------+
| 1        | John       | Banana               |
| 2        | John       | Blackberry           |
| 3        | John       | Blueberry            |
| 4        | Carol      | Apple                |
| 5        | Carol      | Avocado              |
| 6        | Carol      | Banana               |
| 7        | Sam        | Ackee                |
| 8        | Sam        | Apple                |
| 9        | Sam        | Apricots             |
| 10       | Sam        | Banana               |
+----------+------------+----------------------+

Truy vấn

mysql> SELECT tbl1.PersonName 
    -> FROM selectPerson tbl1 
    -> JOIN selectPerson tbl2 ON tbl1.PersonName = tbl2.PersonName 
    -> WHERE tbl1.PersonFavouriteFruit = 'Banana' 
    -> AND tbl2.PersonFavouriteFruit = 'Apple';

Kết quả (Carol, Sam - cả 2 đều thích Banana VÀ Apple)

+------------+
| PersonName |
+------------+
| Carol      |
| Sam        |
+------------+

Tại sao không dùng WHERE ... AND ... trên cùng cột?

SELECT PersonName 
FROM selectPerson 
WHERE PersonFavouriteFruit IN ('Banana', 'Apple')
GROUP BY PersonName 
HAVING COUNT(DISTINCT PersonFavouriteFruit) = 2;

INTERSECT (MySQL 8.0+ không hỗ trợ, dùng INNER JOIN)