首页 > 解决方案 > 如何使用 MySql Join 检索每个主题的帖子数

问题描述

我一直在尝试实现一些 MySql Join 查询。

我有三个表,即“主题”、“帖子”和“用户”。这是我对这些表的架构。 在此处输入图像描述

我正在尝试获取主题名称、主题内容、主题作者的用户名、主题创建日期和所有主题的帖子数量。截至目前,“主题”表中有 20 个条目,每个主题在“帖子”表中有 5 个条目。因此,posts 表有 100 行。

我尝试了以下查询,并希望从结果集中获得 20 行。

SELECT t.id
     , t.name
     , u.user_name
     , DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') created_at
     , COUNT(p.id) reply_count 
  FROM topics t 
  JOIN users u 
    ON t.user_id = u.id 
  JOIN posts p 
    ON p.topic_id = t.id

但是,我无法获得所需的输出。我在输出中只有一行,“reply_count”为 100(“posts”表中有 100 个条目)

我觉得,我在查询的“COUNT(p.id) as reply_count”部分做错了。我尝试使用类似 .. 例如“p.id as reply_count”的内容删除该部分

这是修改后的查询的样子

SELECT t.id
     , t.name
     , u.user_name
     , DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') created_at
     , p.id reply_count 
  FROM topics t 
  JOIN users u 
    ON t.user_id = u.id 
  JOIN posts p 
    ON p.topic_id = t.id

这给了我 100 行的结果,这是正确的。

基本上,我一直在获取每个主题的帖子数量。我哪里做错了?你能提供你的建议吗?

编辑

试图模拟我有什么表和我期待什么样的结果----

这是我尝试过的Sqlfiddle

预期输出——5 行,每行包含主题 ID、主题名称、主题正文、主题创建者的用户名、主题创建时间和“每个主题的帖子数”

标签: mysqljoin

解决方案


您只需要再添加一个子查询来分别获取对主题的回复计数,然后与主表连接,如下所示。

SELECT t.id,t.name, u.user_name, DATE_FORMAT(t.created_at, '%M %e, %Y @ %h:%i %p') as created_at,
p.reply_count
FROM topics t 
JOIN users u ON t.user_id = u.id 
join (select id,count(topic_id) reply_count from post group by id) p ON p.topic_id = t.id

推荐阅读