我有两个表,videos
和videos_ratings
。视频表有一个int videoid
字段(以及许多其他字段,但我认为这些字段并不重要)和许多记录。 videos_ratings
表有3个int字段:videoid
,rating
,rated_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.
希望有人能理解我想要的......:)
谢谢!
答案 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。