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

GROUP BY hai cột và đếm (COUNT) trong MySQL


Sử dụng GROUP BY trên nhiều cột kết hợp COUNT() để thống kê số lần xuất hiện của từng tổ hợp giá trị.

Cú pháp

SELECT column1, column2, COUNT(*) AS cnt
FROM table_name
GROUP BY column1, column2
ORDER BY cnt DESC;

Ví dụ minh họa

mysql> CREATE TABLE GroupByTwoFieldsDemo (Id INT, Name VARCHAR(200));
Query OK, 0 rows affected (0.53 sec)

mysql> INSERT INTO GroupByTwoFieldsDemo VALUES
(1,'John'), (10,'Johnson'), (9,'Carol'), (6,'Sam'),
(5,'David'), (10,'Johnson'), (6,'Sam');
Query OK, 7 rows affected

Dữ liệu (có trùng lặp):

+------+---------+
| Id   | Name    |
+------+---------+
| 1    | John    |
| 10   | Johnson |
| 9    | Carol   |
| 6    | Sam     |
| 5    | David   |
| 10   | Johnson |
| 6    | Sam     |
+------+---------+

GROUP BY hai cột:

mysql> SELECT Id, Name, COUNT(Id) AS cnt
FROM GroupByTwoFieldsDemo
GROUP BY Id, Name
ORDER BY Id DESC;

Kết quả:

+------+---------+-------+
| Id   | Name    | cnt   |
+------+---------+-------+
| 10   | Johnson | 2     |
| 9    | Carol   | 1     |
| 6    | Sam     | 2     |
| 5    | David   | 1     |
| 1    | John    | 1     |
+------+---------+-------+

Lưu ý quan trọng (MySQL 5.7+ / ONLY_FULL_GROUP_BY)

  • Mọi cột trong SELECT phải nằm trong GROUP BY hoặc là hàm tổng hợp (COUNT, SUM...).
  • Ví dụ sai: SELECT Id, Name, Address, COUNT(*) ... GROUP BY Id, Name (Address không hợp lệ).
  • Cần thêm Address vào GROUP BY hoặc dùng ANY_VALUE(Address).

Mở rộng: GROUP BY với ROLLUP

SELECT Id, Name, COUNT(*) 
FROM table_name 
GROUP BY Id, Name WITH ROLLUP;

Thêm dòng tổng cộng (super-aggregate) ở cuối.