You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:43:56