问题
我有一张表 ( posts
),其中包含文章和文章元数据。
另一个表 ( post_reviews
) 包含用户提交的每篇文章的评分(5 分制),posts
由id
相关帖子的 引用。
我试图通过评论找到过去 3 天的前三篇帖子。因此我需要:
- 查找该时间段(3 天)内的所有帖子
- 找到每个帖子的平均评分
- 按平均评分(desc)对它们进行排序
代码
对于第一部分,我可以成功使用查询:
SELECT * FROM `posts` WHERE `hub_id`=:hub_id AND `date`>=:start_date AND `date`<=:end_date)
要查找每个帖子的平均评分,我使用以下查询:
SELECT SUM(`review`) AS `total` FROM `post_reviews` WHERE `id`=:id
然后从中获取行数以计算平均值:
SELECT * FROM `post_reviews` WHERE `post_id`=:id
如何将这三者结合起来,或处理这些数据,以便我可以按平均评分在一段时间内对帖子进行排序?
回答
最终结果如下所示:
SELECT `posts`.`id`, avg(`post_reviews`.`review`) as `average`
FROM `posts`
JOIN `post_reviews` ON (`posts`.`id`=`post_reviews`.`post_id`)
WHERE `hub_id`=:hub_id
AND `posts`.`date`>=:start_date
AND `posts`.`date`<=:end_date
GROUP BY `post_id`
ORDER BY avg(`review`) desc