เมื่อใช้ COUNT(*) แบบธรรมดาจะคืนจำนวนแถวทั้งหมด 1 ค่า แต่ถ้าต้องการนับจำนวน Distinct Values (กลุ่มค่าที่ไม่ซ้ำ) ให้ใช้ Subquery + GROUP BY แล้วนับกลุ่ม
สร้างตารางและข้อมูล (มีค่าซ้ำ)
mysql> create table DemoTable (Value int);
mysql> insert into DemoTable values (10),(20),(10),(30),(10),(20),(40),(10),(20),(20),(60);
ข้อมูลในตาราง (11 แถว)
+-------+ | Value | +-------+ | 10 | | 20 | | 10 | | 30 | | 10 | | 20 | | 40 | | 10 | | 20 | | 20 | | 60 | +-------+
คำสั่ง: นับจำนวนค่าที่ไม่ซ้ำ (Distinct Groups)
mysql> SELECT COUNT(*) FROM (SELECT * FROM DemoTable GROUP BY Value) AS tbl;
ผลลัพธ์: 5 กลุ่ม (10, 20, 30, 40, 60)
+----------+ | COUNT(*) | +----------+ | 5 | +----------+
คำอธิบาย
- Inner:
SELECT * FROM DemoTable GROUP BY Value→ 5 แถว (กลุ่ม) - Outer:
SELECT COUNT(*) FROM (...) tbl→ นับ 5 แถว - Alias (tbl) - จำเป็นใน MySQL
วิธีที่ง่ายกว่า: COUNT(DISTINCT)
SELECT COUNT(DISTINCT Value) FROM DemoTable;
+-----------------------+ | COUNT(DISTINCT Value) | +-----------------------+ | 5 | +-----------------------+
เปรียบเทียบ
| Query | ผลลัพธ์ | ความหมาย |
|---|---|---|
| COUNT(*) | 11 | นับทุกแถว |
| COUNT(Value) | 11 | นับแถวที่ Value ไม่ NULL |
| COUNT(DISTINCT Value) | 5 | นับค่าที่ไม่ซ้ำ (แนะนำ) |
| Subquery GROUP BY | 5 | เทียบเท่า DISTINCT แต่ซับซ้อนกว่า |
ขยาย: แสดงค่าและ Frequency
SELECT Value, COUNT(*) as frequency FROM DemoTable GROUP BY Value ORDER BY frequency DESC;
+-------+-----------+ | Value | frequency | +-------+-----------+ | 10 | 4 | | 20 | 4 | | 30 | 1 | | 40 | 1 | | 60 | 1 | +-------+-----------+
MySQL 8.0+ CTE
WITH value_groups AS (
SELECT Value FROM DemoTable GROUP BY Value
)
SELECT COUNT(*) FROM value_groups;