Vấn đề: Kết hợp GROUP_CONCAT (nối chuỗi) và SUM (tổng ID) trong một truy vấn
Bảng sinh viên có StudentId, StudentName. Cần 1 hàng kết quả: danh sách tên nối bằng dấu chấm, và tổng StudentId.
Giải pháp: GROUP_CONCAT + SUM không cần GROUP BY (tổng cả bảng)
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (
StudentId INT,
StudentName VARCHAR(20)
);
INSERT INTO DemoTable VALUES
(100, 'Chris'), (101, 'Bob'), (102, 'David'), (103, 'Mike');
2. Truy vấn
SELECT
SUM(StudentId) AS TotalId,
GROUP_CONCAT(StudentName SEPARATOR '.') AS ListOfStudent
FROM DemoTable;
3. Kết quả
+---------+----------------------+
| TotalId | ListOfStudent |
+---------+----------------------+
| 406 | Chris.Bob.David.Mike |
+---------+----------------------+
Giải thích
SUM(StudentId)– 100+101+102+103 = 406.GROUP_CONCAT(StudentName SEPARATOR '.')– Nối tên, phân cách bằng dấu chấm. Mặc định phân cách bằng ','.- Không có
GROUP BY→ gom toàn bảng thành 1 nhóm.
Lưu ý quan trọng GROUP_CONCAT
- Độ dài tối đa mặc định: 1024 byte (
group_concat_max_lensystem variable). Dữ liệu lớn → bị cắt. Tăng:SET SESSION group_concat_max_len = 1000000;. - Sắp xếp trong chuỗi:
GROUP_CONCAT(StudentName ORDER BY StudentId SEPARATOR '.'). - Loại trùng:
GROUP_CONCAT(DISTINCT StudentName ...). - Trả về NULL nếu không có hàng (hoặc tất cả NULL).
Ứng dụng
- Xuất báo cáo tóm tắt (CSV-like).
- Tạo danh sách ID cho truy vấn IN động.
- Aggregate cho JSON output.