You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:00:07