MySQL数据库需要一个复杂的sql查询


Need a complex sql query for a MySQL database

我有以下数据库。一个用户可以写一个或多个帖子。投票是多对多的。

用户写帖子。任何人都可以投票支持该职位,因此投票保存在投票表中。

我需要在一个页面上显示所有的帖子。在每个帖子上,都需要显示帖子的作者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

我试过各种各样的组合,但我的大脑就是不起作用。此外,如果有更好的方法来设计数据库,使检索上述内容变得容易,我们将不胜感激。

这有点复杂。在这种情况下,通常需要分别计算每个聚合列。在这种情况下,使用一个子查询来获取帖子数量,使用另一个子查询获取用户数量。

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
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