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)