บทนำ
การนับความถี่ของค่าเฉพาะในคอลัมน์ สามารถทำได้ด้วย GROUP BY ร่วมกับ IN() เพื่อกรองเฉพาะค่าที่สนใจ
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(100)
-> );
Query OK, 0 rows affected (0.87 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('John');
mysql> INSERT INTO DemoTable(Name) VALUES('Chris');
mysql> INSERT INTO DemoTable(Name) VALUES('David');
mysql> INSERT INTO DemoTable(Name) VALUES('Chris');
mysql> INSERT INTO DemoTable(Name) VALUES('Chris');
mysql> INSERT INTO DemoTable(Name) VALUES('John');
mysql> INSERT INTO DemoTable(Name) VALUES('Carol');
mysql> INSERT INTO DemoTable(Name) VALUES('Sam');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์
+----+-------+
| Id | Name |
+----+-------+
| 1 | John |
| 2 | Chris |
| 3 | David |
| 4 | Chris |
| 5 | Chris |
| 6 | John |
| 7 | Carol |
| 8 | Sam |
+----+-------+
8 rows in set (0.00 sec)
คำสั่งนับความถี่ของ 'John' และ 'Chris' เท่านั้น
mysql> SELECT Name, COUNT(*) AS Occurrences
-> FROM DemoTable
-> WHERE Name IN ('John', 'Chris')
-> GROUP BY Name;
ผลลัพธ์
+-------+-------------+
| Name | Occurrences |
+-------+-------------+
| John | 2 |
| Chris | 3 |
+-------+-------------+
2 rows in set (0.00 sec)
วิธีอื่น: ใช้ CASE WHEN (นับทุกค่าในคอลัมน์)
SELECT
SUM(CASE WHEN Name = 'John' THEN 1 ELSE 0 END) AS JohnCount,
SUM(CASE WHEN Name = 'Chris' THEN 1 ELSE 0 END) AS ChrisCount,
SUM(CASE WHEN Name = 'David' THEN 1 ELSE 0 END) AS DavidCount
FROM DemoTable;
เปรียบเทียบ
| วิธี | เหมาะสำหรับ | ผลลัพธ์ |
|---|---|---|
| GROUP BY + WHERE IN | นับค่าที่รู้จักล่วงหน้า | หลายแถว (ต่อค่า 1 แถว) |
| CASE WHEN + SUM | นับหลายค่าใน Query เดียว | 1 แถว หลายคอลัมน์ |