mysql - 在子查询中使用 GROUP_CONCAT 和 JOIN

标签 mysql join subquery group-concat

我在 MySQL 下有一个数据库,其中一个主表具有唯一 ID,几个表列出了不同的选择(有一个 ID 列,一个文本列来描述项目)。因此,对于主表中的一条记录,我可以将多个选择关联到选择表。
我想创建一个所有信息都可见的 View ,使用 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


年龄
----------

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

等等……

提前致谢!

最佳答案

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

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

作为 group_concat() 上的 MySQL 文档表明,您可以使用 distinct 关键字来删除重复值:

To eliminate duplicate values, use the DISTINCT clause.

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;

关于mysql - 在子查询中使用 GROUP_CONCAT 和 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351372/

相关文章:

Mysql错误:1093 - Can't specify target table for update in FROM clause

mysql - MySQL中查询的疑惑

mysql - JOIN 表本身?

select 子句中的 MySQL 子查询

sql - 如何在每个 id 组的列中选择最频繁的值?

mysql - 复杂的 3 方式 SQL 连接(其中表 3 必须在连接表 1 之前连接表 2)

mysql - 如何在 MySQL 中重新排列表?

MySql 多重插入具有多个父级和子级

mysql - 将一个远程数据库移动/复制到另一个远程数据库

mysql - 将内部联接结果合并到一列