Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách dùng COUNT(*) trả về 1 hàng thay vì nhiều hàng trong MySQL?

Sử dụng GROUP BY trong truy vấn con để gom nhóm giá trị trùng lặp, sau đó COUNT(*) đếm số nhóm.

Tạo bảng

mysql> CREATE TABLE DemoTable (Value INT);

Chèn dữ liệu có trùng lặp

mysql> INSERT INTO DemoTable VALUES(10), (20), (10), (30), (10), (20), (40), (10), (20), (20), (60);

Xem dữ liệu (11 hàng, 5 giá trị khác nhau)

mysql> SELECT * FROM DemoTable;
+-------+
| Value |
+-------+
| 10    |
| 20    |
| 10    |
| 30    |
| 10    |
| 20    |
| 40    |
| 10    |
| 20    |
| 20    |
| 60    |
+-------+

Đếm số giá trị khác nhau (distinct values)

mysql> SELECT COUNT(*) FROM (SELECT * FROM DemoTable GROUP BY Value) AS tbl;
+----------+
| COUNT(*) |
+----------+
| 5        |
+----------+

Giải thích

  1. Truy vấn con: SELECT * FROM DemoTable GROUP BY Value → 5 hàng (10, 20, 30, 40, 60)
  2. Truy vấn cha: COUNT(*) đếm 5 hàng đó → 5

Cách đơn giản hơn: COUNT(DISTINCT)

SELECT COUNT(DISTINCT Value) FROM DemoTable;
+------------------------+
| COUNT(DISTINCT Value)  |
+------------------------+
| 5                      |
+------------------------+

Khuyên dùng cách này — ngắn gọn, chuẩn SQL, optimizer tốt hơn.

Khi nào cần subquery GROUP BY?

  • Cần logic phức tạp hơn trong nhóm (ví dụ: HAVING COUNT(*) > 2)
  • Cần truy cập các cột khác của hàng đại diện
  • Học tập/hiểu bản chất GROUP BY

Mở rộng: Đếm tần suất mỗi giá trị

SELECT Value, COUNT(*) AS Frequency FROM DemoTable GROUP BY Value ORDER BY Frequency DESC;
+-------+-----------+
| Value | Frequency |
+-------+-----------+
| 10    | 4         |
| 20    | 5         |
| 30    | 1         |
| 40    | 1         |
| 60    | 1         |
+-------+-----------+