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

ตรวจสอบว่าค่าเฉพาะเจาะจงปรากฏใน GROUP BY group หรือไม่ใน MySQL


แนวคิด

ใช้ SUM(condition) หรือ COUNT(CASE...) ภายใน GROUP BY เพื่อเช็คว่าค่าหนึ่งๆ ปรากฏในกลุ่มหรือไม่

หลักการ

  • SUM(UserName = 'David') → นับจำนวนแถวในกลุ่มที่ UserName = 'David'
  • ถ้า > 0 = มีอยู่, = 0 = ไม่มี
  • wrap ด้วย IF() เพื่อได้ YES/NO

ตัวอย่างครบถ้วน

1. สร้างตาราง

mysql> create table GroupbygroupDemo 
    -> ( 
    -> UserId int, 
    -> UserName varchar(20) 
    -> ); 
Query OK, 0 rows affected (1.48 sec)

2. เพิ่มข้อมูล

mysql> insert into GroupbygroupDemo values(10,'John'); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into GroupbygroupDemo values(10,'Carol'); 
Query OK, 1 row affected (0.08 sec)
mysql> insert into GroupbygroupDemo values(10,'Carol'); 
Query OK, 1 row affected (0.12 sec)
mysql> insert into GroupbygroupDemo values(20,'David'); 
Query OK, 1 row affected (0.17 sec)
mysql> insert into GroupbygroupDemo values(30,'John'); 
Query OK, 1 row affected (0.12 sec)
mysql> insert into GroupbygroupDemo values(30,'David'); 
Query OK, 1 row affected (0.20 sec)
mysql> insert into GroupbygroupDemo values(30,'Mike'); 
Query OK, 1 row affected (0.16 sec)

3. ดูข้อมูล

mysql> select * from GroupbygroupDemo;
+--------+----------+
| UserId | UserName |
+--------+----------+
| 10     | John     |
| 10     | Carol    |
| 10     | Carol    |
| 20     | David    |
| 30     | John     |
| 30     | David    |
| 30     | Mike     |
+--------+----------+

4. เช็คว่าแต่ละ UserId กลุ่มมี 'David' หรือไม่

mysql> select UserId, 
    -> if(sum(UserName = 'David'), 'YES', 'NO') as Has_David 
    -> from GroupbygroupDemo 
    -> group by UserId;
+--------+-----------+
| UserId | Has_David |
+--------+-----------+
| 10     | NO        |
| 20     | YES       |
| 30     | YES       |
+--------+-----------+

วิธีอื่น: ใช้ COUNT + CASE

SELECT UserId,
       CASE WHEN COUNT(CASE WHEN UserName = 'David' THEN 1 END) > 0 
            THEN 'YES' ELSE 'NO' END AS Has_David
FROM GroupbygroupDemo
GROUP BY UserId;

ขยาย: เช็คหลายค่าพร้อมกัน

SELECT UserId,
       MAX(CASE WHEN UserName = 'David' THEN 1 ELSE 0 END) AS has_david,
       MAX(CASE WHEN UserName = 'John' THEN 1 ELSE 0 END) AS has_john,
       MAX(CASE WHEN UserName = 'Mike' THEN 1 ELSE 0 END) AS has_mike
FROM GroupbygroupDemo
GROUP BY UserId;
+--------+-----------+----------+----------+
| UserId | has_david | has_john | has_mike |
+--------+-----------+----------+----------+
| 10     | 0         | 1        | 0        |
| 20     | 1         | 0        | 0        |
| 30     | 1         | 1        | 1        |
+--------+-----------+----------+----------+

ประยุกต์: Conditional Aggregation

SELECT 
  department,
  COUNT(*) AS total,
  SUM(gender = 'F') AS female_count,
  SUM(salary > 50000) AS high_salary_count
FROM employees
GROUP BY department;

สรุป: SUM(boolean_expression) = จำนวนแถวที่ตรงเงื่อนไขในแต่ละกลุ่ม ใช้ได้หลากหลาย