【发布时间】:2017-09-27 22:11:04
【问题描述】:
所以我想使用关联表连接两个表,因为表“a”连接到表“b”中的多行,并且我想从每个表中获取与我的 a.value 匹配的所有结果但是表 'b' 中的值应该以某种方式连接起来。
现在我的查询如下所示:
SELECT *,
GROUP_CONCAT(DISTINCT g.group_name) group_name,
GROUP_CONCAT(DISTINCT g.group_profile_id) group_profile_id,
GROUP_CONCAT(DISTINCT g.group_publications) group_publications,
GROUP_CONCAT(DISTINCT g.group_followers) group_followers,
GROUP_CONCAT(DISTINCT g.group_ongoing_projects) group_ongoing_projects,
GROUP_CONCAT(DISTINCT g.group_finished_projects) group_finished_projects,
GROUP_CONCAT(DISTINCT g.group_members) group_members
FROM projects_groups pg
LEFT JOIN projects p on p.projectid = pg.projectid
RIGHT JOIN groups g on g.groupid = pg.groupid
WHERE p.projectid IN ($projectIds)
GROUP BY p.projectid
问题是我什至没有选择组表的一半列,但我想获得所有列。我可以像上面一样写下所有列,但它看起来真的很丑,而且每次我改变我的表时我都必须修改它。
为了进一步解释项目可以连接到多个组的问题,我想获取项目数据及其组的所有数据。我可以分别查询这些组,但这似乎不合逻辑,因为我必须为每个项目(例如 100 个项目)都这样做。因此,我在一个查询中获取所有项目,然后对每个项目进行查询以获取其组。或者我可以在一个查询中将项目与关联表连接,然后从关联表中获取 id,并使用这些 id 进行第二次查询以通过关联获取所有组,但我正在寻找一种更简单的解决方案。
【问题讨论】:
-
也不起作用,因为表
a中的不同行可以连接到表b中的同一行,因此它们不是唯一的。 -
您永远不应该在子表中
GROUP BY列,因为对于任何不匹配的行,该列将是NULL,然后所有不匹配的行将被组合在一起。 -
要解决必须列出所有列的问题,您可以编写一个存储过程,从
INFORMATION_SCHEMA.COLUMNS动态构建查询。 -
您确定要使用
LEFT JOIN和RIGHT JOIN吗?如果project_groups中的列是外键,它们在主表中应该总是有一个匹配项。 -
谢谢Barmar,我已经纠正了你指出的错误。从
INFORMATION_SCHEMA.COLUMNS构建查询有点像我想要的。
标签: mysql join group-concat