SQL中INNER JOIN与AVG()返回错误数据,需计算视频平均评分
解决关联表计算视频平均评分的SQL问题
嘿,我看你是想从已审核视频表(videos_approved)里取出所有视频信息,再关联评分表(videos_rating)计算每个视频的平均评分对吧?你的思路是对的,不过你的SQL语句没写完,而且还有几个关键点需要注意,我来帮你完善一下:
首先,你原来的SQL用到了INNER JOIN,但如果有些视频还没有任何评分记录,INNER JOIN会直接把这些视频排除掉,不符合你“选取所有行”的需求。更合适的是用LEFT JOIN,这样能保留所有已审核的视频,哪怕它还没收到评分。
其次,因为用到了聚合函数AVG(),必须用GROUP BY把所有非聚合的字段(也就是videos_approved里的视频信息列)分组,不然数据库会报错。
完整的SQL语句
SELECT t1.video_id, t1.video_title, t1.video_url, t1.video_views, AVG(t2.videos_rating_rating) AS average_rating FROM videos_approved t1 LEFT JOIN videos_rating t2 ON t1.video_id = t2.video_id -- 这里是两张表的关联条件,用视频ID匹配 GROUP BY t1.video_id, t1.video_title, t1.video_url, t1.video_views;
额外优化建议
如果想把没有评分的视频的平均评分显示为0(而不是默认的NULL),可以用COALESCE()函数来处理:
SELECT t1.video_id, t1.video_title, t1.video_url, t1.video_views, COALESCE(AVG(t2.videos_rating_rating), 0) AS average_rating FROM videos_approved t1 LEFT JOIN videos_rating t2 ON t1.video_id = t2.video_id GROUP BY t1.video_id, t1.video_title, t1.video_url, t1.video_views;
另外,如果需要控制评分的小数位数(比如保留1位小数),可以搭配ROUND()函数:
COALESCE(ROUND(AVG(t2.videos_rating_rating), 1), 0) AS average_rating
内容的提问来源于stack exchange,提问作者ii iml0sto1
相关产品推荐
相关产品推荐

