我在 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/