这可能吗?
我有一张存放文章的表
我有另一个表存储用户对文章的评分,每一行都是参考文章的评级
我想获得过去30天内文章的平均评分:
SELECT `ex`.`article_id` , `ex`.`date` , `ex`.`title` , `r`.AVG(`rating`)
FROM `exclusive` `ex`
JOIN `ratings` `r` ON `ex`.`article_id` = `r`.`article_id`
WHERE `ex`.`date` > NOW( ) - INTERVAL 30 DAY
正如您所看到的,我正试图引用导致问题的AVG功能的“评级”。我认为问题在于评级需要在选择之前计算一些我开始怀疑它是否可能?
答案 0 :(得分:1)
您必须指明数据应如何分组,以指示用于平均计算的组,例如:
SELECT `ex`.`article_id` , `ex`.`title` , AVG(r.rating)
FROM `exclusive` `ex`
JOIN `ratings` `r` ON `ex`.`article_id` = `r`.`article_id`
WHERE `ex`.`date` > NOW( ) - INTERVAL 30 DAY
GROUP BY ex.article_id
答案 1 :(得分:0)
你的语法有点不对:
更改
..., r.AVG(rating)
要
..., AVG(r.rating)
在查询末尾添加group by子句:
...
GROUP BY 1, 2, 3
应该看起来像:
SELECT `ex`.`article_id` , `ex`.`date` , `ex`.`title` , AVG(`r`.`rating`)
FROM `exclusive` `ex`
JOIN `ratings` `r` ON `ex`.`article_id` = `r`.`article_id`
WHERE `ex`.`date` > NOW( ) - INTERVAL 30 DAY
GROUP BY 1, 2, 3
答案 2 :(得分:0)
请注意,为了平均评分,您应该主要按日期汇总其尺寸,比如按照您的要求对过去30天进行分组,但为此,您应该避免按每个评论(标题)和每个日期进行汇总。试试这个:
SELECT `ex`.`article_id` , AVG( case when `ex`.`date` ` > NOW( ) - INTERVAL 30 DAY
then `r`.`rating` else 0 end) as 30_day_rating_average FROM `exclusive` `ex` JOIN `ratings` `r` ON `ex`.`article_id` = `r`.`article_id` group by 1
您还可以获取包含文章名称的列,而不仅仅是文章ID。