Khi dùng GROUP BY một cột, các cột khác trong SELECT phải là hàm tổng hợp (SUM, MAX, v.v.) hoặc nằm trong GROUP BY. Để "giữ lại" tất cả giá trị của cột khác, dùng GROUP_CONCAT() nối chuỗi.
Ví dụ minh họa
Tạo bảng:
CREATE TABLE groupByOneSelectAll (
StudentDetails VARCHAR(100),
StudentName VARCHAR(100)
);
INSERT INTO groupByOneSelectAll VALUES
('StudentFirstName', 'John'),
('StudentFirstName', 'Chris'),
('StudentFirstName', 'Robert'),
('StudentFirstName', 'Bob'),
('StudentFirstName', 'David');
Dữ liệu (5 hàng, cùng StudentDetails):
+------------------+-------------+ | StudentDetails | StudentName | +------------------+-------------+ | StudentFirstName | John | | StudentFirstName | Chris | | StudentFirstName | Robert | | StudentFirstName | Bob | | StudentFirstName | David | +------------------+-------------+
Gom nhóm StudentDetails, nối tất cả StudentName:
SELECT StudentDetails, GROUP_CONCAT(StudentName) FROM groupByOneSelectAll GROUP BY StudentDetails;
Kết quả (1 hàng):
+------------------+-----------------------------+ | StudentDetails | GROUP_CONCAT(StudentName) | +------------------+-----------------------------+ | StudentFirstName | John,Chris,Robert,Bob,David | +------------------+-----------------------------+
Lưu ý:
- Mặc định
GROUP_CONCATgiới hạn 1024 ký tự. Tăng bằng:SET SESSION group_concat_max_len = 1000000;. - Sắp xếp trong chuỗi:
GROUP_CONCAT(StudentName ORDER BY StudentName SEPARATOR '; '). - Nếu cần giữ cấu trúc dòng (không gộp chuỗi), hãy dùng window function
ROW_NUMBER()hoặc JOIN lại bảng gốc.