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

如何用单条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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:23:14