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

นับค่าที่ปรากฏเพียงครั้งเดียวในคอลัมน์ MySQL ด้วย GROUP BY HAVING

เมื่อต้องการนับจำนวนค่าที่ ปรากฏเพียงครั้งเดียว (Unique Occurrence) ในคอลัมน์ ให้ใช้ GROUP BY ... HAVING COUNT(*) = 1 แล้วนับจำนวนกลุ่มนั้น

สร้างตารางและข้อมูล (มีค่าซ้ำหลายค่า)

mysql> create table DemoTable (Name varchar(20));
mysql> insert into DemoTable values 
('Larry'),('Larry'),('Sam'),('Chris'),('Sam'),
('Mike'),('Sam'),('Larry'),('Mike'),('Mike'),
('Carol'),('Robert');

ข้อมูลในตาราง (12 แถว)

+--------+
| Name   |
+--------+
| Larry  |
| Larry  |
| Sam    |
| Chris  |
| Sam    |
| Mike   |
| Sam    |
| Larry  |
| Mike   |
| Mike   |
| Carol  |
| Robert |
+--------+

คำสั่งนับค่าที่ปรากฏครั้งเดียว

mysql> SELECT COUNT(Name) FROM (
    SELECT Name FROM DemoTable 
    GROUP BY Name 
    HAVING COUNT(*) = 1
) AS APPEAR_FIRST_TIME;

ผลลัพธ์: 3 ค่า (Chris, Carol, Robert)

+-------------+
| COUNT(Name) |
+-------------+
| 3           |
+-------------+

คำอธิบายขั้นตอน

  1. Inner Query: GROUP BY Name → ได้กลุ่ม: Larry(3), Sam(3), Mike(3), Chris(1), Carol(1), Robert(1)
  2. HAVING COUNT(*) = 1 - กรองเฉพาะกลุ่มที่มี 1 แถว → Chris, Carol, Robert
  3. Outer Query: COUNT(Name) - นับจำนวนกลุ่มที่เหลือ = 3
  4. ขยาย: แสดงชื่อที่ปรากฏครั้งเดียว

    SELECT Name FROM DemoTable 
    GROUP BY Name 
    HAVING COUNT(*) = 1;
    +--------+
    | Name   |
    +--------+
    | Chris  |
    | Carol  |
    | Robert |
    +--------+

    MySQL 8.0+ ใช้ CTE อ่านง่ายกว่า

    WITH name_counts AS (
        SELECT Name, COUNT(*) as cnt FROM DemoTable GROUP BY Name
    )
    SELECT COUNT(*) as unique_count FROM name_counts WHERE cnt = 1;

    ประยุกต์: หาค่าที่ซ้ำ (Duplicates)

    SELECT Name, COUNT(*) as cnt FROM DemoTable 
    GROUP BY Name HAVING COUNT(*) > 1;
    +-------+-----+
    | Name  | cnt |
    +-------+-----+
    | Larry | 3   |
    | Sam   | 3   |
    | Mike  | 3   |
    +-------+-----+