Khi gom nhóm bằng GROUP BY, có thể cùng lúc đếm số hàng (COUNT) và lấy giá trị lớn nhất (MAX) của cột trong nhóm.
Ví dụ minh họa
Tạo bảng:
mysql> CREATE TABLE DemoTable (ClientId INT, Value INT); mysql> INSERT INTO DemoTable VALUES (10,678), (20,678), (30,678);
Truy vấn: gom theo Value, đếm số ClientId, lấy ClientId lớn nhất:
mysql> SELECT COUNT(tbl.ClientId), MAX(tbl.ClientId)
-> FROM DemoTable tbl
-> GROUP BY Value;
Kết quả (1 nhóm Value=678, 3 hàng, Max ClientId=30):
+---------------------+-------------------+ | COUNT(tbl.ClientId) | MAX(tbl.ClientId) | +---------------------+-------------------+ | 3 | 30 | +---------------------+-------------------+
Giải thích
GROUP BY Value: 3 hàng cùng Value=678 → 1 nhóm.COUNT(tbl.ClientId): đếm 3 hàng (ClientId không NULL).MAX(tbl.ClientId): lấy giá trị lớn nhất trong nhóm = 30.
Mở rộng: Thêm cột nhóm vào SELECT
SELECT Value, COUNT(*) AS cnt, MAX(ClientId) AS max_id FROM DemoTable GROUP BY Value;
Kết quả:
+-------+-----+--------+ | Value | cnt | max_id | +-------+-----+--------+ | 678 | 3 | 30 | +-------+-----+--------+
Lưu ý về tiêu đề bài gốc
Tiêu đề "GROUP does not work if COUNT is used" **không đúng** – GROUP BY hoạt động hoàn toàn bình thường với COUNT, MAX, MIN, SUM, AVG... cùng lúc. Đây là cách dùng chuẩn của SQL.
Các hàm tập hợp (aggregate) thường dùng cùng GROUP BY
| Hàm | Mô tả |
|---|---|
| COUNT(*) | Số hàng |
| COUNT(cot) | Số hàng cot không NULL |
| SUM(cot) | Tổng |
| AVG(cot) | Trung bình |
| MIN(cot) | Giá trị nhỏ nhất |
| MAX(cot) | Giá trị lớn nhất |
| GROUP_CONCAT(cot) | Nối chuỗi các giá trị |