MySQL评分系统(从两个表中计算平均值)

时间:2010-03-13 06:26:14

标签: sql mysql join

我有两个表,videosvideos_ratings。视频表有一个int videoid字段(以及许多其他字段,但我认为这些字段并不重要)和许多记录。 videos_ratings表有3个int字段:videoidratingrated_by,它有很多记录(来自videos表的每个字段有多条记录)但不是对于videos表中的所有记录。

目前我有以下mysql查询:

  SELECT `videos`.*, avg(`videos_ratings`.`vote`) 
    FROM `videos`, `videos_ratings` 
   WHERE `videos_ratings`.`videoid` = `videos`.`videoid` 
GROUP BY `videos_ratings`.`videoid` 
ORDER BY RAND() LIMIT 0, 12

它选择表videos中具有表video_ratings评级的所有记录,并正确计算平均值。但我需要的是从videos表中选择所有记录,无论该记录是否有评级。如果videos_ratings表中没有针对该特定videos记录的任何记录,则平均函数应显示为0.

希望有人能理解我想要的......:)

谢谢!

2 个答案:

答案 0 :(得分:1)

使用:

   SELECT v.*,
          COALESCE(x.avg_vote, 0)
     FROM VIDEOS v
LEFT JOIN (SELECT vr.videoid,
                  AVG(vr.vote) AS avg_vote
             FROM VIDEO_RATINGS vr
         GROUP BY vr.videoid) x ON x.videoid = v.videoid
 ORDER BY RAND()
    LIMIT 12

请注意ORDER BY RAND()无法很好地扩展 - 请参阅this question for better alternatives

答案 1 :(得分:0)

您需要进行LEFT JOIN以包含视频表中的所有记录,即使没有评级。

然后,您可以在select中添加if()以将NULL等级设置为0。