【问题标题】:Use a GROUP_CONCAT and JOIN in a subquery在子查询中使用 GROUP_CONCAT 和 JOIN
【发布时间】:2016-11-16 00:33:25
【问题描述】:

我在 MySQL 下有一个数据库,其中一个具有唯一 ID 的主表,几个列出不同选择的表(一个 id 列,一个用于描述项目的文本列)。因此,对于主表中的一条记录,我可以将多个选项关联到选项表。
我想创建一个所有信息都可见的视图,使用 GROUP_CONCAT 将给定​​“选择”表中的不同选择连接到一个字段中。但是,当记录与另一个“选择”表中的其他多项选择相关时,我的查询会重复每个选择列表多次。查询返回这些选项之间的所有可能组合...
这是我的查询(例如,减少到 2 个“选择”表 -t_age, t_animal-)

SELECT general.id_g,
    GROUP_CONCAT(CAST(t_age AS CHAR) SEPARATOR ', ') AS age,
    GROUP_CONCAT(CAST(t_animal AS CHAR) SEPARATOR ', ') AS animal
FROM general
LEFT JOIN  interm_age 
    INNER JOIN t_age ON interm_age.id_age = t_age.id_age
ON general.id_g = interm_age.id_g  
LEFT JOIN  interm_animal 
    INNER JOIN t_animal ON interm_animal.id_animal = t_animal.id_animal
ON general.id_g = interm_animal.id_g
GROUP BY id_g;

我尝试将子查询中的每个 CONCAT/JOIN 包含到主 SELECT 中,如下所示,但 MySQL 告诉我“返回超过 1 行”,确实如此。还有?

SELECT id_g, (
    SELECT GROUP_CONCAT(CAST(t_age AS CHAR) SEPARATOR ', ')
    FROM general
    LEFT JOIN  interm_age 
    INNER JOIN t_age ON interm_age.id_age = t_age.id_age
    ON general.id_g = interm_age.id_g  
    GROUP BY general.id_g  )
FROM general;


[编辑] 更详细地说,这是我的数据库(带有 FK)

一般
------------

id_g  |  date
902   |    2016/01/01
956   |    2016/02/01
959   |    2016/02/01


中间年龄
------------

id_age  | id_g
1       |     902
3       |     902
1       |     956
4       |     956


中间动物
------------

id_animal  |     id_g
1          |     902
5          |     902
5          |     959
7          |     959


t_age
------------

id_age  |     age
1       |     <10y
3       |     >10y
4       |     >60y


t_动物
------------

id_animal  | animal
1          |    bird
5          |     mammal
7          |     insect


我想要类似的东西:

id_g | date       | age        | animal
902  | 2016/01/01 | <10y, >10y | bird, mammal

等等……

提前致谢!

【问题讨论】:

    标签: mysql join subquery group-concat


    【解决方案1】:

    试试这个

    SELECT general.id_g,
        GROUP_CONCAT(CAST(t_age AS CHAR) SEPARATOR ', ') AS age,
        GROUP_CONCAT(CAST(t_animal AS CHAR) SEPARATOR ', ') AS animal
    FROM general
    LEFT JOIN  interm_age 
        INNER JOIN t_age ON interm_age.id_age = t_age.id_age AND general.id_g = interm_age.id_g  
    LEFT JOIN  interm_animal 
        INNER JOIN t_animal ON interm_animal.id_animal = t_animal.id_animal AND general.id_g = interm_animal.id_g
    GROUP BY id_g;
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,但它也不起作用。第二个 ON 是陈述第一个 JOIN 的子句。请注意,到目前为止,这部分查询已经完成了这项工作。或者,我可以编写两个单独的 LEFT JOIN,因为它似乎做同样的事情。
    【解决方案2】:

    虽然你最好提供一些示例数据、实际结果和预期结果,但我会尝试解决方案。

    问题可能是您在连接表中有多个匹配记录,这导致 group_concat() 中的值重复。

    正如group_concat() 上的 MySQL 文档所示,您可以使用 distinct 关键字删除重复值:

    要消除重复值,请使用 DISTINCT 子句。

    SELECT general.id_g,
        GROUP_CONCAT(DISTINCT CAST(t_age AS CHAR) SEPARATOR ', ') AS age,
        GROUP_CONCAT(DISTINCT CAST(t_animal AS CHAR) SEPARATOR ', ') AS animal
    FROM general
    LEFT JOIN  interm_age 
        INNER JOIN t_age ON interm_age.id_age = t_age.id_age
    ON general.id_g = interm_age.id_g  
    LEFT JOIN  interm_animal 
        INNER JOIN t_animal ON interm_animal.id_animal = t_animal.id_animal
    ON general.id_g = interm_animal.id_g
    GROUP BY id_g;
    

    【讨论】:

    • 感谢您的快速回复。不幸的是,添加 DISTINCT 并没有帮助。我已编辑我的问题以显示更多详细信息。
    • 如果使用 distinct 关键字会得到什么输出?
    • “子查询返回超过 1 行”,因此与没有 DISTINCT 的错误相同。我在 SELECT 中的子查询遇到了类似的问题,我使用 UNION 在与条件一样多的查询之间解决了它(使用 CASE WHEN)。但是在这里,我没有任何条件可以填写..
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2014-10-25
    • 2013-10-19
    • 2015-02-03
    • 2013-10-11
    • 2015-03-04
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多