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
SELECTphải nằm trongGROUP BYhoặ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.