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