MySQL多表左连接统计问题:如何正确统计视频播放量与点赞数?
视频播放量与点赞数统计的MySQL查询修正方案
问题分析
你原查询得到错误结果的核心原因是:
- 直接关联
view和like表会产生笛卡尔积:对于videoId=10,view有2条记录,like有1条记录,连接后生成2×1=2条重复数据 - GROUP BY错误包含了
VW.id和L.id,分组逻辑混乱,最终count(L.id)统计到2条重复记录,得到错误的点赞数2
正确解法
解法1:子查询预统计(推荐,性能更优)
先分别对播放、点赞数据按视频ID分组统计,再关联视频表,从根源避免笛卡尔积:
SELECT V.id AS videoId, COALESCE(VW.views, 0) AS views, COALESCE(L.likes, 0) AS likes FROM video V LEFT JOIN ( SELECT videoId, COUNT(id) AS views FROM view GROUP BY videoId ) VW ON VW.videoId = V.id LEFT JOIN ( SELECT videoId, COUNT(id) AS likes FROM `like` GROUP BY videoId ) L ON L.videoId = V.id WHERE V.id = 10;
COALESCE用于处理无播放/点赞的视频,返回0而非NULL- 子查询提前聚合数据,避免多表连接产生大量重复行
解法2:使用COUNT(DISTINCT)去重计数
在原查询基础上修改,通过去重避免重复统计:
SELECT V.id AS videoId, COUNT(DISTINCT VW.id) AS views, COUNT(DISTINCT L.id) AS likes FROM video V LEFT JOIN view VW ON VW.videoId = V.id LEFT JOIN `like` L ON L.videoId = V.id WHERE V.id = 10 GROUP BY V.id;
COUNT(DISTINCT)会忽略重复的记录ID,确保统计的是真实的播放/点赞次数- 去掉GROUP BY中多余的
VW.id和L.id,仅按视频ID分组
验证结果
两种解法均会返回预期结果:
videoId views likes 10 2 1
内容的提问来源于stack exchange,提问作者Noam
相关产品推荐
相关产品推荐

