Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么将多行合并为一列会复制数据?_Mysql_Sql_Join_Group Concat - Fatal编程技术网

Mysql 为什么将多行合并为一列会复制数据?

Mysql 为什么将多行合并为一列会复制数据?,mysql,sql,join,group-concat,Mysql,Sql,Join,Group Concat,我知道这个问题以前有人回答过,但我找不到一个有类似问题的 我在下面创建了一个示例表: TableA - aID | aName 1 | House TableB - bID | bmodel | bname | aID 1 | studio | classy | 1 2 | studio | small | 1 3 | apartment | classy | 1 Table

我知道这个问题以前有人回答过,但我找不到一个有类似问题的

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

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
我加入的团体越多,重复的次数就越多

我使用的代码是:

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,但会排除具有重复项的行,即studio、classy、卧房、big

在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列表

输出:


谢谢蒂姆!成功了!但是你认为使用join会弄乱我的输出吗?我想了解问题的原因。@SamFlynn连接的潜在问题是,最终将两个表中的两组数据相乘,这不是您想要的。如果你有更多的数据,问题可能会变得更糟。
aID aName   bmodel_bname                  cmodel_cname
1   House   studio classy,studio small,   bedroom big,bedroom small,
            apartment classy              bathroom big