mysql - 如何使用 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、主题名称、主题正文、主题创建者的用户名、主题创建时间和“每个主题的帖子数”
解决方案
您只需要再添加一个子查询来分别获取对主题的回复计数,然后与主表连接,如下所示。
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
推荐阅读
- javascript - Knex 迁移失败并出现错误:查询为空
- javascript - 赛普拉斯:变量没有看到我在跑步者中看到的文本变化
- asp.net - 安装 Visual Studio 2019 后,IIS 会抱怨“<%@ Page Async="true" %>”
- r - 根据一行过滤重复项并根据另一行中的值排除它们
- sql-server - MS SQL Server - 创建辅助子集表时如何复制列约束
- html - 图像和右对齐文本的网站响应性问题
- c# - Automapper 不会从动态对象映射到具有带参数的构造函数的对象
- spring - 如何在春季将千分尺标签添加到webClient
- c++ - 尝试在 LIST_ENTRY 列表中打印下一个进程名称后出现蓝屏
- javascript - 我可以在数据表中使用 ajax 成功和错误函数吗?