使用GROUP_CONCAT查询双表出现重复数据问题求助
问题原因与解决方案
嘿,我来帮你拆解下为啥查询结果会出现重复条目~
重复的核心原因:笛卡尔积导致的多对多匹配
先看你的查询结构:
- 子查询
a:对attributes表按owner和key分组,每一个不同的key会生成一行结果(比如如果owner=162012有3个不同key,就返回3行)。 - 子查询
r:同理,对reqs表按owner和key分组,每一个不同的key生成一行结果(比如有2个不同key就返回2行)。
当你用INNER JOIN关联这两个子查询时,因为它们的owner都是162012,就会产生笛卡尔积——也就是a的每一行都会和r的每一行匹配一次。比如上面的例子会得到3×2=6行数据。之后外层的GROUP_CONCAT会把这6行里的内容全部拼接,自然就会让每个causConc重复2次,每个causConc2重复3次,最终结果就出现了重复。
两种解决思路
思路1:先各自聚合为单行,再关联
让每个子查询先按owner聚合生成单行结果,再做join,这样就不会产生笛卡尔积了:
SELECT a.owner, a.attributes, r.reqs FROM ( SELECT owner, GROUP_CONCAT('{' || key || ',' || GROUP_CONCAT(value, ',') || ';}' , '') AS attributes FROM attributes WHERE owner = 162012 GROUP BY owner ) a INNER JOIN ( SELECT owner, GROUP_CONCAT('{' || key || ',' || GROUP_CONCAT(value, ',') || ';}' , '') AS reqs FROM reqs WHERE owner = 162012 GROUP BY owner ) r ON a.owner = r.owner
思路2:直接用子查询作为字段(适合单owner查询)
如果只是查询单个特定owner,可以跳过join,直接把两个表的聚合结果作为字段查询:
SELECT 162012 AS owner, (SELECT GROUP_CONCAT('{' || key || ',' || GROUP_CONCAT(value, ',') || ';}' , '') FROM attributes WHERE owner = 162012) AS attributes, (SELECT GROUP_CONCAT('{' || key || ',' || GROUP_CONCAT(value, ',') || ';}' , '') FROM reqs WHERE owner = 162012) AS reqs
这样处理后,就能得到你想要的单行无重复的结果啦~
内容的提问来源于stack exchange,提问作者Andreas B
相关产品推荐
相关产品推荐

