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

Select ค่าที่ตรงเงื่อนไขต่างกันในแถวต่างๆ ด้วย IN() และ GROUP BY HAVING

หาค่าที่ตรงเงื่อนไขหลายอย่างในแถวต่างกัน (Relational Division)

โจทย์: หา FirstRow ที่มี SecondRow ครบทุกค่าในชุด (10, 100, 300)

รูปแบบคำสั่ง (Syntax)

SELECT yourColumnName1
FROM yourTableName
WHERE yourColumnName2 IN (value1, value2, ...)
GROUP BY yourColumnName1
HAVING COUNT(DISTINCT yourColumnName2) = number_of_values;

ตัวอย่างการใช้งาน

สร้างตาราง DifferentRows:

CREATE TABLE DifferentRows (
    FirstRow INT,
    SecondRow INT
);

INSERT INTO DifferentRows VALUES 
(10, 10), (10, 100), (10, 300), (20, 100);

ข้อมูล:

FirstRowSecondRow
1010
10100
10300
20100

หา FirstRow ที่มี SecondRow ครบ 10, 100, 300:

SELECT FirstRow
FROM DifferentRows
WHERE SecondRow IN (10, 100, 300)
GROUP BY FirstRow
HAVING COUNT(DISTINCT SecondRow) = 3;

ผลลัพธ์:

FirstRow
10

อธิบายตรรกะ

  1. WHERE SecondRow IN (10,100,300) - กรองเฉพาะแถวที่ SecondRow อยู่ในชุดเป้าหมาย
  2. GROUP BY FirstRow - จับกลุ่มตาม FirstRow
  3. HAVING COUNT(DISTINCT SecondRow) = 3 - กลุ่มไหนมีค่า SecondRow ครบ 3 ค่าที่ต้องการ (Distinct กันนับซ้ำ)

การประยุกต์: หานักเรียนที่เรียนวิชาครบทุกวิชาที่กำหนด

SELECT student_id
FROM enrollments
WHERE course_id IN ('MATH101', 'PHYS101', 'CHEM101')
GROUP BY student_id
HAVING COUNT(DISTINCT course_id) = 3;

Pattern นี้เรียกว่า Relational Division ใช้แก้ปัญหา "Find entities that have ALL of a set of attributes"