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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:45:54