ใช้ Self-JOIN (JOIN ตารางกับตัวเอง) เพื่อหาแถวที่ตรงเงื่อนไขหลายอย่างพร้อมกัน
สร้างตารางตัวอย่าง
mysql> CREATE TABLE selectPerson (
-> PersonId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> PersonName VARCHAR(20),
-> PersonFavouriteFruit VARCHAR(60)
-> );
เพิ่มข้อมูลตัวอย่าง (10 แถว)
mysql> INSERT INTO selectPerson(PersonName, PersonFavouriteFruit) VALUES
('John', 'Banana'), ('John', 'Blackberry'), ('John', 'Blueberry'),
('Carol', 'Apple'), ('Carol', 'Avocado'), ('Carol', 'Banana'),
('Sam', 'Ackee'), ('Sam', 'Apple'), ('Sam', 'Apricots'), ('Sam', 'Banana');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM selectPerson;
ผลลัพธ์:
+----------+------------+----------------------+ | 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 | +----------+------------+----------------------+
หาบุคคลที่ชอบ "Apple" AND "Banana" พร้อมกัน (Self-JOIN)
mysql> SELECT tbl1.PersonName
-> FROM selectPerson tbl1
-> JOIN selectPerson tbl2 ON tbl1.PersonName = tbl2.PersonName
-> WHERE tbl1.PersonFavouriteFruit = 'Banana'
-> AND tbl2.PersonFavouriteFruit = 'Apple';
ผลลัพธ์ (Carol, Sam):
+------------+ | PersonName | +------------+ | Carol | | Sam | +------------+
อธิบาย Logic
tbl1กรองคนที่ชอบ Bananatbl2กรองคนที่ชอบ AppleJOIN ON PersonNameรวมเฉพาะคนที่อยู่ในทั้งสองกลุ่ม- John ชอบ Banana แต่ไม่ชอบ Apple → ไม่出现
วิธีอื่น: GROUP BY + HAVING
SELECT PersonName
FROM selectPerson
WHERE PersonFavouriteFruit IN ('Apple', 'Banana')
GROUP BY PersonName
HAVING COUNT(DISTINCT PersonFavouriteFruit) = 2;
ผลลัพธ์เหมือนกัน (Carol, Sam) - เข้าใจง่ายกว่า ประสิทธิภาพดีกว่า
วิธีอื่น: INTERSECT (MySQL 8.0+ ไม่รองรับ ต้องใช้ workaround)
-- MySQL ไม่มี INTERSECT ตรงๆ SELECT PersonName FROM selectPerson WHERE PersonFavouriteFruit = 'Apple' AND PersonName IN (SELECT PersonName FROM selectPerson WHERE PersonFavouriteFruit = 'Banana');
ขยายเป็น 3 เงื่อนไขขึ้นไป
Self-JOIN จะซับซ้อน (JOIN 3 ครั้ง) → ควรใช้ GROUP BY ... HAVING COUNT(DISTINCT ...) = N แทน