Mysql 连接行的最有效方法

Mysql 连接行的最有效方法,mysql,group-by,relational-database,aggregate-functions,group-concat,Mysql,Group By,Relational Database,Aggregate Functions,Group Concat,我的SQL知识确实有点生疏,但我有一个稍微简单的问题要问专家。我有三张桌子: 职位 -邮政编码 -名字 -描述 职位类别 -邮政编码 -鼻涕虫 张贴主题 -邮政编码 -鼻涕虫 基本上,我想查询如下帖子列表: SELECT post_id, name, description, themes, categories FROM posts LIMIT 0, 50 我想合并相关的类别和主题表,并将它们连接到一个列中。因此,我的输出是: 1 |测试|描述|音乐、艺术、历史|重要、相关、新 我尝试将其作

我的SQL知识确实有点生疏,但我有一个稍微简单的问题要问专家。我有三张桌子:

职位 -邮政编码 -名字 -描述

职位类别 -邮政编码 -鼻涕虫

张贴主题 -邮政编码 -鼻涕虫

基本上,我想查询如下帖子列表:

SELECT post_id, name, description, themes, categories FROM posts LIMIT 0, 50
我想合并相关的类别和主题表,并将它们连接到一个列中。因此,我的输出是:

1 |测试|描述|音乐、艺术、历史|重要、相关、新

我尝试将其作为子查询,但遇到了返回多行的常见问题。我还尝试左加入结果,但似乎无法返回正确的结果。由于担心在没有意识到的情况下干扰我的结果,我希望有人能帮助制定最有效和正确的查询


谢谢。

从主表(posts)开始,您可以定期连接主题表和类别表。在这种情况下,左连接用于允许没有类别或主题的行显示在结果中

要获得逗号分隔的值,您可以根据
帖子中的值(每行应有一个值的值)进行分组,并使用逗号分隔未分组的值,如

SELECT p.post_id, p.name, p.description,
   COALESCE(GROUP_CONCAT(pc.slug), '') categories,
   COALESCE(GROUP_CONCAT(pt.slug), '') themes
FROM posts p
LEFT JOIN posts_categories pc ON p.post_id = pc.post_id
LEFT JOIN posts_themes pt ON p.post_id = pt.post_id
GROUP BY p.post_id, p.name, p.description
ORDER BY p.post_id, p.name, p.description
LIMIT 50

.

您是的未来满意的客户

考虑这个子查询:

SELECT post_id, GROUP_CONCAT(slug) AS slugs
  FROM posts_categories
 GROUP BY post_id
它将通过post为您提供以逗号分隔的类别slug列表。类似的查询将为您提供主题片段

然后,您只需加入这些子查询,就可以得到这个结果

SELECT a.post_id, a.name, a.description,
       b.slugs AS categories,
       c.slugs AS themes
  FROM posts AS a
  LEFT JOIN (
          SELECT post_id, GROUP_CONCAT(slug) AS slugs
            FROM posts_categories
           GROUP BY post_id
       ) AS b ON a.post_id = b.post_id
  LEFT JOIN (
          SELECT post_id, GROUP_CONCAT(slug) AS slugs
            FROM posts_themes
           GROUP BY post_id
       ) AS c ON a.post_id = c.post_id
 ORDER BY a.post_id
诀窍是将正确的摘要创建为子查询,然后将它们连接到posts表


注意:如果只处理类别或主题,则可以避免子查询,只需左键加入posts\u categories表,然后在主查询上执行分组。但是,如果你同时加入
post\u类别
posts\u主题
表,你会在逗号分隔的列表中得到组合爆炸和大量额外数据。

我比奥利·琼斯更喜欢你的解决方案,但我不知道为什么有必要按名称和描述进行分组。我的数据集中也有重复的结果。我如何确保它们是独一无二的?我相信在组集合之前抛出DISTINCT()会起作用。@Ddibias在MySQL中,如果id足够唯一,您可以只按id分组,但是其他RDBMS(postgresql/sql server/oracle/…)甚至MySQL可以设置为更严格的一些模式,要求您按所有单个值分组。我不确定你得到的是什么样的复制品,你能举个例子吗?