我有以下数据库。一个用户可以写一个或多个帖子。投票是多对多的。
用户撰写帖子。任何人都可以投票支持该投票,因此投票保存在投票表中。
我需要在页面上显示所有帖子。在每个帖子上,需要显示帖子的作者,post_votes和作者的投票。
我的表是:
Table: user
id | user_name
1 | John
2 | Sam
3 | Susan
Table: post
id | post_title | user_id
1 | Hello | 1
2 | Sunday | 1
3 | Monday | 2
4 | Sun | 1
5 | Sun | 3
Table: votes
id | post_id
1 | 1
2 | 1
3 | 3
4 | 2
5 | 3
6 | 1
我需要查询返回以下结果集:
post_id | post_votes | user_id | user_votes
1 | 3 | 1 | 4
2 | 1 | 1 | 4
3 | 2 | 2 | 2
4 | NULL | 1 | 4
5 | NULL | 3 | NULL
我尝试了各种各样的组合,但我的大脑不会起作用。另外,如果有更好的方法来设计数据库以便可以轻松检索上述内容,那将非常感激。
答案 0 :(得分:1)
这有点复杂。在这种情况下,您经常需要单独计算每个聚合列。在这种情况下,使用一个子查询来获取帖子数量,使用另一个子查询来获取用户数量。
select p.post_id, pv.post_votes, uv.user_id, uv.user_votes
from post p left outer join
(select v.post_id, count(*) as post_votes
from votes v
group by v.post_id
) pv
on p.id = pv.id left outer join
(select p.user_id, count(*) as user_votes
from votes v join
post p
on p.id = v.post_id
group by p.user_id
) uv
on p.user_id = uv.user_id
答案 1 :(得分:0)
SELECT
post.id,
post.user_id,
post_votes.total,
user_votes.total
FROM
post
LEFT JOIN
(SELECT post_id, COUNT(*) as total FROM votes GROUP BY post_id) AS post_votes
ON post_votes.post_id = post.id
LEFT JOIN
(SELECT user_id, COUNT(*) as total FROM votes GROUP BY user_id) AS user_votes
ON user_votes.user_id = post.user_id