连接 3 个表并使用 SUM 计算属于一个线程的论坛帖子的评级

Joining 3 tables and using SUM to calculate ratings of forum posts belonging to one thread

我正在为我的学校项目做一个简单的讨论板。我有这些 tables 来存储用户,posts 和那些 posts 的评级(我将省略对这个问题无关紧要的列和 tables。

+------------+
|    User    |
+------------+
|PK|  id_user|
+------------+
|    username|
| profile_pic|
+------------+   

+------------+
|    Post    |
+------------+
|PK|  id_post|
+------------+
|     id_user|
|   id_thread|
|     content|
| date_posted|
|     deleted|
+------------+ 

+------------+
|Post_ratings|
+------------+
|PK| id_voter|
|PK|  id_post|
+------------+
|      rating|
+------------+ 

我想要做的是 select Post table 中具有特定 id_thread 的所有行,将其与 User table 到 select 每个 post 的 post 人的 usernameprofile_pic,以及每个 post 的评分总和, 所以结果的列应该是 id_post, id_user, content, date_posted, deleted, username, profile_pic , 和 rating.

我只能想出这个草率的查询:

SELECT * FROM Post p LEFT JOIN 
(SELECT id_user, username, profile_pic FROM User) u 
ON p.id_user = u.id_user LEFT JOIN 
(SELECT id_post redundant, SUM(rating) rating FROM Post_ratings) pr 
ON p.id_post = pr.redundant 
WHERE id_thread = 5 AND deleted = 0 
ORDER BY date_posted

这会 return 属于一个线程的所有 post,但它显示 post 的 ID 两次(redundant 列)并显示 post 的 SUM =38=]all 行中所有线程的评分最低 id_post,在其他行中显示 NULL

如果有人能帮忙,先谢谢了。

我会使用联接将用户和帖子关联起来 table,并使用子查询对评分求和:

select p.*, u.username, u.profile_pic,
    (select sum(pr.rating) from post_ratings pr where pr.id_post = p.id_post) as rating
from posts p
inner join users u on u.id_user = p.id_user
where p.id_thread = 5 and p.deleted = 0

当然也可以使用外聚合:

select p.*, u.username, u.profile_pic, sum(pr.rating) as rating
from posts p
inner join users u on u.id_user = p.id_user
inner join post_ratings pr on pr.id_post = p.id_post
where p.id_thread = 5 and p.deleted = 0
group by p.id_post, u.user_id

MySQL 了解功能相关的列,因此将帖子和用户的主键 table 放在 group by 子句中就足够了。