การนับจำนวนแถวตามกลุ่มด้วย COUNT() และ GROUP BY
ฟังก์ชัน COUNT() ใช้ร่วมกับ GROUP BY เพื่อนับจำนวนรายการในแต่ละกลุ่ม ได้ผลลัพธ์แสดงค่าของคอลัมน์ที่จัดกลุ่ม พร้อมจำนวนนับ
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(100),
Subject VARCHAR(100)
);
เพิ่มข้อมูล:
INSERT INTO DemoTable (Name, Subject) VALUES
('John', 'MySQL'),
('John', 'Java'),
('Carol', 'MongoDB'),
('Carol', 'Java'),
('Carol', 'MySQL'),
('John', 'MySQL'),
('Carol', 'MongoDB');
ข้อมูลในตาราง
+----+-------+---------+ | Id | Name | Subject | +----+-------+---------+ | 1 | John | MySQL | | 2 | John | Java | | 3 | Carol | MongoDB | | 4 | Carol | Java | | 5 | Carol | MySQL | | 6 | John | MySQL | | 7 | Carol | MongoDB | +----+-------+---------+
คำสั่งนับจำนวนวิชาต่อคน
SELECT Name, Subject, COUNT(Subject) AS SubjectCount FROM DemoTable GROUP BY Name, Subject;
ผลลัพธ์
+-------+---------+--------------+ | Name | Subject | SubjectCount | +-------+---------+--------------+ | John | MySQL | 2 | | John | Java | 1 | | Carol | MongoDB | 2 | | Carol | Java | 1 | | Carol | MySQL | 1 | +-------+---------+--------------+
คำอธิบาย:
GROUP BY Name, Subjectจัดกลุ่มตามคู่ Name+Subject ที่ซ้ำกันCOUNT(Subject)นับจำนวนแถวในแต่ละกลุ่ม (ไม่นับ NULL)- สามารถใช้
COUNT(*)ได้ผลลัพธ์เหมือนกัน เพราะไม่มีค่า NULL ในคอลัมน์ Subject
เคล็ดลับเพิ่มเติม:
- ใช้
COUNT(DISTINCT Subject)หากต้องการนับวิชาที่ไม่ซ้ำกันต่อคน - เพิ่ม
HAVING COUNT(Subject) > 1เพื่อกรองเฉพาะกลุ่มที่มีมากกว่า 1 รายการ - ใส่
ORDER BY SubjectCount DESCเพื่อเรียงจากมากไปน้อย