【问题标题】:Why does combining multiple rows into one column duplicates data?为什么将多行合并为一列会重复数据?
【发布时间】:2018-03-11 00:06:09
【问题描述】:

我知道这个问题之前已经回答过,但我找不到有类似问题的问题。

我在下面创建了一个示例表:

TableA - aID | aName
          1  | House


TableB - bID | bmodel    | bname  | aID
          1  | studio    | classy |  1
          2  | studio    | small  |  1
          3  | apartment | classy |  1

TableC - cID | cmodel   | cname  | aID
          1  | bedroom  | big    | 1
          2  | bedroom  | small  | 1
          3  | bedroom  | big    | 1

我正在努力实现

aID | aName |          bmodel bname                            |     cmodel cname
 1  | house | studio classy, studio small, apartment classy    | bed big, bed small, bed big

这就是发生的事情

aID | aName |          bmodel bname                                                                          |     cmodel cname
 1  | house | studio classy, studio small, apartment classy, studio classy, studio small, appartment classy  | bedroom big, bedroom small, bedroom small, bedroom big, bedroom small, bedroom small

我添加的 GROUP_CONCAT 越多,它就会重复得越多。

我使用的代码:

SELECT 
    TableA.aId, TableA.aname,
    GROUP_CONCAT(CONCAT(TableB.bmodel, ' ', TableB.bname) SEPARATOR ', ') as BModNam,
    GROUP_CONCAT(CONCAT(TableC.cmodel, ' ', TableC.cname) SEPARATOR ', ') AS CModNam

FROM TableB
    JOIN cases
        ON TableB.aID = TableA.aId
    JOIN TableC
        ON TableC.aid = TableA.aID

WHERE
    TableA.aID=1

我知道我可以使用 distinct 但会排除有重复的行(即工作室、经典、卧室、大)

【问题讨论】:

    标签: mysql sql join group-concat


    【解决方案1】:

    在 select 语句中调用 GROUP_CONCAT 作为子查询:

    SELECT
        aID,
        aName,
        (SELECT GROUP_CONCAT(CONCAT(b.bmodel, ' ', b.bname))
         FROM TableB b WHERE b.aID = t.aID GROUP BY b.aID) AS bmodel_bname,
        (SELECT GROUP_CONCAT(CONCAT(c.cmodel, ' ', c.cname))
         FROM TableC c WHERE c.aID = t.aID GROUP BY c.aID) AS cmodel_cname
    FROM TableA t
    WHERE aID = 1;
    

    连接以及当前输出的问题在于,您将两个表中的模型和名称集相乘。使用子查询可以解决这个问题,因为每个子查询都会为该表生成一个聚焦的 CSV 列表。

    输出:

    aID aName   bmodel_bname                  cmodel_cname
    1   House   studio classy,studio small,   bedroom big,bedroom small,
                apartment classy              bathroom big
    

    Demo

    【讨论】:

    • 谢谢蒂姆!有效!但是你认为使用 join 搞砸了我的输出吗?我想了解问题的原因。
    • @SamFlynn 加入的潜在问题是您最终将两个表中的两组数据相乘,这不是您想要的。如果您有更多数据,问题可能会变得更糟。
    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多