MySQL多表关联如何按id聚合单行 合并关联字段值为单一列
你当前查询返回多行的核心原因是:和一对多结构的my_table2做LEFT JOIN时,结果集会按所有匹配的关联行逐行展开,每行单独执行一次CONCAT_WS拼接操作,自然会出现同一个id重复输出多行的情况。
要实现单id单行、所有关联值合并到同一字段的效果,需要借助MySQL的聚合能力,把匹配到的多条my_table2记录先做值聚合,再和my_table1的固定列拼接,调整后的查询语句如下:
SELECT my_table1.id, CONCAT_WS( ' ', my_table1.column1, my_table1.column2, GROUP_CONCAT(my_table2.column1 SEPARATOR ' ') ) AS new_column FROM my_table1 LEFT JOIN my_table2 ON my_table1.id = my_table2.id GROUP BY my_table1.id, my_table1.column1, my_table1.column2;
调整后的查询会按my_table1的维度分组聚合,最终输出结果完全匹配预期:
| id | new_column |
|---|---|
| 1 | George something DDD HHH FFF |
| 2 | Peter anything LLL TTT |
实操注意事项
GROUP_CONCAT函数默认以逗号作为分隔符,这里指定SEPARATOR ' '才能匹配预期的空格拼接格式- 分组时把
my_table1的所有非聚合列(id、column1、column2)都加入GROUP BY子句,是为了兼容MySQL开启ONLY_FULL_GROUP_BY严格模式时的语法要求,避免执行报错 GROUP_CONCAT默认有1024字节的内容长度限制,如果后续需要拼接更长的关联值,可以通过调整数据库的group_concat_max_len参数扩大可处理的内容长度- 查询保留了LEFT JOIN逻辑,就算某个
my_table1的行在my_table2中没有任何匹配记录,结果也能正常输出,不会丢失my_table1本身的数据
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

