คำอธิบาย
บทความนี้สาธิตการใช้ GROUP แบบมีเงื่อนไข (Conditional GROUP BY) ร่วมกับ NOT IN เพื่อดึงเฉพาะชื่อที่มีคะแนนเท่ากับ 89 เท่านั้น (ไม่มีคะแนนอื่น)
ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable (
Name varchar(40),
Score int );
Query OK, 0 rows affected (0.48 sec)
การเพิ่มข้อมูล
mysql> insert into DemoTable values('Adam', 89);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Adam', 89);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Chris', 89);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Chris', 89);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('Bob', 98);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Bob', 89);
Query OK, 1 row affected (0.16 sec)
แสดงข้อมูลทั้งหมด
mysql> select * from DemoTable;
ผลลัพธ์:
+-------+-------+ | Name | Score | +-------+-------+ | Adam | 89 | | Adam | 89 | | Chris | 89 | | Chris | 89 | | Bob | 98 | | Bob | 89 | +-------+-------+ 6 rows in set (0.00 sec)
คิวรี่กรองชื่อที่มีคะแนน 89 เท่านั้น (ไม่มีคะแนนอื่น)
mysql> select distinct Name
from DemoTable
where Name not in (
select Name from DemoTable where Score <> 89
);
ผลลัพธ์
+-------+ | Name | +-------+ | Adam | | Chris | +-------+ 2 rows in set (0.06 sec)
คำอธิบายตรรกะ
- Subquery หาชื่อที่มีคะแนน ไม่เท่ากับ 89 (ได้ Bob)
- NOT IN กรองชื่อเหล่านั้นออก (ตัด Bob ออก)
- เหลือ Adam และ Chris ที่มีคะแนน 89 เท่านั้น
- DISTINCT ป้องกันการซ้ำของชื่อ
การประยุกต์ใช้
เหมาะสำหรับการหาลูกค้าที่ซื้อสินค้าเฉพาะประเภทเดียว พนักงานที่ทำงานเฉพาะแผนกเดียว เป็นต้น