MySQL分组聚合时如何拼接被聚合的列值?
解决MySQL分组聚合时拼接PublicNotes的问题
这问题我太熟悉了!当你用GROUP BY聚合记录时,默认只会保留每组中某一条记录的PublicNotes值,其他关联的内容就直接丢失了。要在保持原有分组逻辑的同时把所有相关的PublicNotes拼接起来,MySQL的GROUP_CONCAT()函数就是专门干这个的。
修改后的完整查询
把你原查询里的PublicNotes字段替换成GROUP_CONCAT()的调用就可以了,这里我还加了IFNULL()处理空值,避免出现多余的分隔符:
select ConfirmationNumber, ReservationDate, ifnull(CASE TableNumber WHEN 0 THEN 'UNASSIGNED' ELSE TableNumber END,'UNASSIGNED') AS 'Table', CONCAT(LastName, ', ', FirstName) AS 'Customer', Email, Phone, GROUP_CONCAT(IFNULL(PublicNotes, '') SEPARATOR '; ') AS PublicNotes, -- 关键修改在这里 sum(SleighSeats) + sum(CabSeats) AS Seats from Reservations where ReservationDate = '2018-1-25' and ConfirmationNumber IS NOT NULL and CancelDate IS NULL group by TableNumber, Customer order by TableNumber
关键细节说明
GROUP_CONCAT()会把同一分组内所有非NULL的PublicNotes值用指定的分隔符拼接成一个完整字符串SEPARATOR '; '是自定义的分隔符,你可以换成逗号、换行符('\n')或者任何你觉得合适的符号- 如果担心有重复的笔记内容,可以加上
DISTINCT去重,比如GROUP_CONCAT(DISTINCT IFNULL(PublicNotes, '') SEPARATOR '; ') - 要是想让拼接的内容按某个顺序排列,还可以在函数里加
ORDER BY,比如GROUP_CONCAT(IFNULL(PublicNotes, '') ORDER BY ConfirmationNumber SEPARATOR '; ')
注意事项
MySQL默认对GROUP_CONCAT()的结果长度有限制(默认是1024字节),如果你的PublicNotes内容很多、拼接后太长,可能会被截断。这时候可以临时调整参数:
-- 全局级别调整 SET GLOBAL group_concat_max_len = 1000000; -- 仅当前会话生效 SET SESSION group_concat_max_len = 1000000;
这样修改后,你提到的那三条被聚合的记录就会把所有PublicNotes内容拼接在一起,不会再丢失啦!
内容的提问来源于stack exchange,提问作者HerrimanCoder
相关产品推荐
相关产品推荐

