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

MySQL: GROUP BY แบบมีเงื่อนไขกับ NOT IN เพื่อกรองค่าซ้ำ


คำอธิบาย

บทความนี้สาธิตการใช้ 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)

คำอธิบายตรรกะ

  1. Subquery หาชื่อที่มีคะแนน ไม่เท่ากับ 89 (ได้ Bob)
  2. NOT IN กรองชื่อเหล่านั้นออก (ตัด Bob ออก)
  3. เหลือ Adam และ Chris ที่มีคะแนน 89 เท่านั้น
  4. DISTINCT ป้องกันการซ้ำของชื่อ

การประยุกต์ใช้

เหมาะสำหรับการหาลูกค้าที่ซื้อสินค้าเฉพาะประเภทเดียว พนักงานที่ทำงานเฉพาะแผนกเดียว เป็นต้น