Để đếm số lần xuất hiện của mỗi giá trị ID (hoặc nhóm giá trị) và hiển thị số lượng đó như một cột riêng, MySQL sử dụng GROUP BY kết hợp với hàm tập hợp COUNT() hoặc COUNT(DISTINCT ...).
Ví dụ minh họa
Tạo bảng đánh giá khách hàng:
mysql> CREATE TABLE DemoTable1453 (
CustomerId INT,
CustomerReviewNumber INT
);
Chèn dữ liệu (CustomerId 10, 11, 13 lặp lại nhiều lần):
mysql> INSERT INTO DemoTable1453 VALUES (10, 4); mysql> INSERT INTO DemoTable1453 VALUES (10, 4); mysql> INSERT INTO DemoTable1453 VALUES (11, 5); mysql> INSERT INTO DemoTable1453 VALUES (11, 5); mysql> INSERT INTO DemoTable1453 VALUES (11, 5); mysql> INSERT INTO DemoTable1453 VALUES (13, 2); mysql> INSERT INTO DemoTable1453 VALUES (11, 5); mysql> INSERT INTO DemoTable1453 VALUES (10, 4); mysql> INSERT INTO DemoTable1453 VALUES (13, 2);
Dữ liệu (9 hàng):
mysql> SELECT * FROM DemoTable1453;
+------------+----------------------+ | CustomerId | CustomerReviewNumber | +------------+----------------------+ | 10 | 4 | | 10 | 4 | | 11 | 5 | | 11 | 5 | | 11 | 5 | | 13 | 2 | | 11 | 5 | | 10 | 4 | | 13 | 2 | +------------+----------------------+
Đếm số ReviewNumber DISTINCT cho mỗi CustomerId
mysql> SELECT CustomerId,
COUNT(DISTINCT CustomerReviewNumber)
FROM DemoTable1453
GROUP BY CustomerId;
Kết quả (mỗi CustomerId chỉ có 1 ReviewNumber duy nhất):
+------------+--------------------------------------+ | CustomerId | count(distinct CustomerReviewNumber) | +------------+--------------------------------------+ | 10 | 1 | | 11 | 1 | | 13 | 1 | +------------+--------------------------------------+
Các biến thể đếm thường dùng
| Cú pháp | Ý nghĩa | Kết quả ví dụ (CustomerId=10) |
|---|---|---|
COUNT(*) | Số hàng (kể trùng lặp hoàn toàn) | 3 |
COUNT(CustomerReviewNumber) | Số hàng có ReviewNumber không NULL | 3 |
COUNT(DISTINCT CustomerReviewNumber) | Số giá trị ReviewNumber khác nhau | 1 |
Mở rộng: Hiển thị cả số hàng tổng và số giá trị distinct
SELECT
CustomerId,
COUNT(*) AS TotalRows,
COUNT(DISTINCT CustomerReviewNumber) AS DistinctReviewNumbers
FROM DemoTable1453
GROUP BY CustomerId;
+------------+-----------+-----------------------+ | CustomerId | TotalRows | DistinctReviewNumbers | +------------+-----------+-----------------------+ | 10 | 3 | 1 | | 11 | 4 | 1 | | 13 | 2 | 1 | +------------+-----------+-----------------------+
Ứng dụng thực tế
- Phát hiện dữ liệu trùng lặp:
HAVING COUNT(*) > 1. - Thống kê tần suất: Số đơn hàng / khách, số lượt xem / bài viết.
- Phân tích độ đa dạng: Số sản phẩm khác nhau / đơn hàng.