Mysql 连接行的最有效方法
我的SQL知识确实有点生疏,但我有一个稍微简单的问题要问专家。我有三张桌子: 职位 -邮政编码 -名字 -描述 职位类别 -邮政编码 -鼻涕虫 张贴主题 -邮政编码 -鼻涕虫 基本上,我想查询如下帖子列表: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 |测试|描述|音乐、艺术、历史|重要、相关、新 我尝试将其作
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可以设置为更严格的一些模式,要求您按所有单个值分组。我不确定你得到的是什么样的复制品,你能举个例子吗?