MySQL与AVG计算连接

MySQL与AVG计算连接,mysql,join,average,Mysql,Join,Average,这可能吗 我有一张存放物品的桌子 我有另一个表存储用户对文章的评分,每一行都是引用文章的评分 我想得到过去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( )

这可能吗

我有一张存放物品的桌子

我有另一个表存储用户对文章的评分,每一行都是引用文章的评分

我想得到过去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函数来引用“评级”。我认为问题在于,在进行选择之前,需要计算评级。我开始怀疑这是否可能?

您必须指出数据应如何分组,以指示用于平均计算的组,例如:

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

您的语法有点不正确:

改变

..., r.AVG(rating)

并在查询末尾添加GROUPBY子句:

...
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

请记住,为了平均评级,您应该主要按日期聚合itś维度,比如按您的要求对最后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。

此解决方案不会平均收视率,合并日期将按每个日期平均,合并标题时,您将聚合每个收视率,因此您将得到n个相同的平均评论。@Ryan谢谢,但“分组方式”是什么,似乎如果我按更改组的列,这将决定结果的排序方式?当然,它做的不止这些,但我看不出有什么?太棒了,这很好,“分组依据”做什么,我不熟悉这种语法。像AVG、SUM、COUNT等函数都是聚合函数,它们为非聚合列中共享相同值的一组行提供一个值,但必须指定GROUPBY子句中的其他列。SQL标准允许您使用列编号(在查询中)而不是列名/表达式。谢谢,这个示例为我节省了很多钱:
    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