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

ใช้ COUNT(*) กับ GROUP BY คืนค่า 1 แถวแทนหลายแถวใน MySQL

เมื่อใช้ 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        |
+----------+

คำอธิบาย

  1. Inner: SELECT * FROM DemoTable GROUP BY Value → 5 แถว (กลุ่ม)
  2. Outer: SELECT COUNT(*) FROM (...) tbl → นับ 5 แถว
  3. 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 BY5เทียบเท่า 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;