如何用单条SQL语句统计两表中各活动的邀请、接受及评论数
活动邀请、接受及评论数统计解决方案
问题分析
直接将EventInvitation与EventRSVPComment关联后聚合会出错,核心原因是两个表存在一对多关联关系:一个活动对应多条邀请记录和多条评论,关联后数据会被笛卡尔积展开,导致邀请数、接受数被重复统计(比如EventId=1的2条邀请记录和3条评论关联后会生成6条数据,COUNT(*)会错误统计为6而非2)。
正确SQL写法
方法1:预聚合后关联(推荐,性能更优)
先分别对两个表按EventId聚合,再关联结果:
SELECT EI_Stats.EventId, EI_Stats.Invited, EI_Stats.Accepted, COALESCE(ERC_Stats.CommentCount, 0) AS CommentCount FROM ( -- 统计每个活动的总邀请数、总接受数 SELECT EventId, COUNT(*) AS Invited, SUM(CASE WHEN IsAccepted = 1 THEN 1 ELSE 0 END) AS Accepted FROM EventInvitation GROUP BY EventId ) AS EI_Stats LEFT JOIN ( -- 统计每个活动的总评论数 SELECT EventId, COUNT(*) AS CommentCount FROM EventRSVPComment GROUP BY EventId ) AS ERC_Stats ON EI_Stats.EventId = ERC_Stats.EventId
方法2:子查询直接获取评论数
如果数据量不大,也可以用子查询在SELECT语句中直接拉取对应活动的评论数:
SELECT EI.EventId, COUNT(*) AS Invited, SUM(CASE WHEN EI.IsAccepted = 1 THEN 1 ELSE 0 END) AS Accepted, -- 子查询获取当前活动的评论数 (SELECT COUNT(*) FROM EventRSVPComment ERC WHERE ERC.EventId = EI.EventId) AS CommentCount FROM EventInvitation EI GROUP BY EI.EventId
关键说明
- 使用
LEFT JOIN确保没有评论的活动也能被展示; COALESCE函数将无评论活动的CommentCount从NULL转为0,保证数据格式统一;- 预聚合的方式避免了关联后的数据膨胀,在数据量大时性能更稳定。
内容的提问来源于stack exchange,提问作者Fylix
相关产品推荐
相关产品推荐

