Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

นับจำนวนครั้งที่ค่าเฉพาะปรากฏในคอลัมน์ด้วย MySQL Query เดียว

บทนำ

การนับความถี่ของค่าเฉพาะในคอลัมน์ สามารถทำได้ด้วย 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 แถว หลายคอลัมน์