GROUP_CONCAT(SELECT * FROM table)是这样的吗?

时间:2017-09-27 22:11:04

标签: mysql join group-concat

所以我想使用关联表连接两个表,因为表'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进行第二次查询以通过关联获取所有组,但我正在寻找更简单的解决方案。

1 个答案:

答案 0 :(得分:0)

可惜这个问题没有包含样本数据和预期结果,但是有一些值得一提的语法问题。用这个开始你的FROM子句:

FROM projects_groups pg 
LEFT JOIN projects p on p.projectid = pg.projectid

即使没有关联的项目,也允许来自projects_groups的所有行。如果没有关联的项目,那么所有项目。*列都将为NULL。但是在where子句中你需要这个:WHERE p.projectid IN ($projectIds)这意味着项目表中的任何NULL都会被忽略,因此LEFT JOIN是无用的。

因为项目似乎是主要关注的问题,所以将它与FROM一起使用,然后加入适合您需求的其他表。现在我的猜测是你可以有一个没有项目组的项目(即使只是暂时的),所以你可以在这里使用左连接,所以查询可能看起来像这样

FROM projects p
LEFT JOIN  projects_groups pg on p.projectid = pg.projectid
WHERE p.projectid IN ($projectIds)

但请注意,如果您想要列出项目,即使他们没有关联的项目组,您也只会这样做。所以做出你需要的假设,然后继续这个左连接到组:

FROM projects p
LEFT JOIN  projects_groups pg on p.projectid = pg.projectid
LEFT JOIN groups g on g.groupid = pg.groupid 
WHERE p.projectid IN ($projectIds)

如果假设是错误的,那么使用内部联接会更有效:

FROM projects p
INNER JOIN  projects_groups pg on p.projectid = pg.projectid
INNER JOIN groups g on g.groupid = pg.groupid 
WHERE p.projectid IN ($projectIds)

现在我们需要看一下SELECT& GROUP BY条款。 MySQL历史上允许使用非标准的GROUP BY语法,默认设置允许像您这样的查询,其中只有一列列在GROUP BY中。

e.g。在过去,这是允许的:

select p.* from projects p group by p.id

这是非常糟糕的做法,现在MySQL的当前版本现在默认为标准SQL语法。在标准SQL语法规则下,您必须在group by子句中指定每个“非聚合列”。所以上面的例子会产生语法错误

e.g。你应该始终按列

精确地了解这个群体
select p.id, p.name, count(*) from projects p group by p.id, p.name

因此,为了避免语法错误,您可能更喜欢使用“派生表”,如下所示:

SELECT
       p.* 
     , d.*
FROM projects p
INNER JOIN (
        SELECT
            p.projectid 
          , 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 p
        LEFT JOIN  projects_groups pg on p.projectid = pg.projectid
        LEFT JOIN groups g on g.groupid = pg.groupid 
        WHERE p.projectid IN ($projectIds)
        GROUP BY
            p.projectid 
        ) d on p.projectid = d.projectid