Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ใช้ JOIN เลือกข้อมูลที่ตรงเงื่อนไขหลายอย่างพร้อมกัน (AND)

ใช้ 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 กรองคนที่ชอบ Banana
  • tbl2 กรองคนที่ชอบ Apple
  • JOIN 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 แทน