连接 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 人的 username
和 profile_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
子句中就足够了。
我正在为我的学校项目做一个简单的讨论板。我有这些 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 人的 username
和 profile_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
子句中就足够了。