1

问题

我有一张表 ( posts),其中包含文章和文章元数据。

另一个表 ( post_reviews) 包含用户提交的每篇文章的评分(5 分制),postsid相关帖子的 引用。

我试图通过评论找到过去 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
4

3 回答 3

1

不知道你hub_id代表什么,但我认为这是必要的;还假设 Posts 中的关键字段是posts.post_id而不是posts.id

SELECT   `p`.`id`, avg(`pr`.`review`) AS `average`
FROM     `posts`        AS `p`
JOIN     `post_reviews` AS `pr` ON (`p`.`id`=`pr`.`post_id`)
WHERE    `hub_id` =:hub_id
     AND `p`.`date` BETWEEN CURRENT_DATE-3 AND CURRENT_DATE
GROUP BY `p`.`id`
ORDER BY avg(`review`) DESC;

请参阅示例:sqlfiddle

于 2013-08-09T23:12:39.607 回答
0

这是一个与 sqlfiddle 一起使用来证明它的查询。

SELECT 
  p.hub_id
 ,p.post_id
 ,p.article
 ,p.articleMeta
 ,p.date
 ,IFNULL(AVG(r.ratings), 0) averageRating
FROM posts p
  LEFT JOIN post_reviews r ON
    r.post_id = p.post_id
WHERE 
    hub_id = 1 
  AND date >= CURDATE() - 3
  AND date <= CURDATE()
GROUP BY 
  p.hub_id
 ,p.post_id
 ,p.article
 ,p.articleMeta
 ,p.date
ORDER BY
  p.date DESC
 ,averageRating DESC

http://sqlfiddle.com/#!2/39315/1

于 2013-08-09T23:29:44.360 回答
0

不确定 MySQL 的语法,但需要 join 和 group by。就像是....

SELECT post_id. avg(review)
FROM Posts P Inner Join Post_reviews PR on (p.post_id = pr.Post_id)
WHERE `hub_id`=:hub_id AND `date`>=:start_date AND `date`<=:end_date)
Group by Post_id
order by 2 desc
于 2013-08-09T23:09:08.333 回答