ใช้ COUNT() ร่วมกับ GROUP BY เพื่อนับจำนวนการเกิดของแต่ละค่าในคอลัมน์
ตัวอย่างข้อมูล
CREATE TABLE DistinctDemo1 (
id INT,
name VARCHAR(100)
);
INSERT INTO DistinctDemo1 VALUES
(1, 'John'), (2, 'John'), (3, 'John'),
(4, 'Carol'), (5, 'David');
Query นับจำนวนแต่ละชื่อ
SELECT
name,
COUNT(*) AS OccurrenceValue
FROM DistinctDemo1
GROUP BY name
ORDER BY OccurrenceValue;
ผลลัพธ์
+-------+----------------+
| name | OccurrenceValue|
+-------+----------------+
| Carol | 1 |
| David | 1 |
| John | 3 |
+-------+----------------+
Variations
1. นับค่า Unique เท่านั้น (COUNT DISTINCT)
SELECT COUNT(DISTINCT name) FROM DistinctDemo1;
-- ผลลัพธ์: 3 (John, Carol, David)
2. นับรวม NULL ด้วย
SELECT
name,
COUNT(*) AS total_rows,
COUNT(name) AS non_null_count
FROM DistinctDemo1
GROUP BY name;
3. ใส่เงื่อนไข HAVING (Filter หลัง Group)
SELECT name, COUNT(*) AS cnt
FROM DistinctDemo1
GROUP BY name
HAVING COUNT(*) > 1; -- แสดงเฉพาะชื่อที่ซ้ำ
4. เรียงลำดับตามจำนวน (มากไปน้อย)
SELECT name, COUNT(*) AS cnt
FROM DistinctDemo1
GROUP BY name
ORDER BY cnt DESC, name;
Performance Tips
- สร้าง Index บนคอลัมน์ที่ GROUP BY:
CREATE INDEX idx_name ON DistinctDemo1(name) - ใช้
COUNT(*)แทนCOUNT(column)(เร็วกว่าใน InnoDB) - หลีกเลี่ยง
SELECT *ใน Subquery ที่ Group By
ใช้กับ Window Function (MySQL 8.0+)
SELECT
name,
COUNT(*) OVER (PARTITION BY name) AS name_count
FROM DistinctDemo1;
-- แสดง Count ต่อแถว ไม่รวม Group