SQL查询特定用户投票时,全量投票统计未按POLL_ID分组的问题排查
SQL投票统计错误原因分析
你的查询存在两个核心问题,导致V1/V2/V3返回全表投票总和而非对应POLL_ID的统计值:
缺少GROUP BY分组子句
你使用了SUM()聚合函数,但未指定按POLL_ID分组。这会让数据库对整个查询结果集进行全局汇总,而非针对每个独立的投票项(POLL_ID)分别统计各选项的投票数。JOIN操作引发的数据重复
当你将筛选出指定用户投票的FILTERED_VOTES表,与包含所有投票的WHOLE_VOTES表通过POLL_ID关联时,会产生笛卡尔积效应:每个指定用户的投票记录,会与对应POLL_ID下的所有投票记录一一匹配。比如POLL_ID=1时,FILTERED_VOTES有1条记录,WHOLE_VOTES有2条记录,JOIN后会生成2条重复记录。缺少分组的情况下,SUM()会累加这些重复数据,进一步放大统计误差。
修正后的查询示例
先对所有投票按POLL_ID预统计各选项数量,再关联用户投票和投票内容表,避免数据重复:
SELECT p.POLL_ID, p.CONTENT, fv.VOTE, wv.V1, wv.V2, wv.V3 FROM POLLS p JOIN VOTES fv ON p.POLL_ID = fv.POLL_ID AND fv.USER_ID = 'U1' JOIN ( SELECT POLL_ID, SUM(VOTE = 1) AS V1, SUM(VOTE = 2) AS V2, SUM(VOTE = 3) AS V3 FROM VOTES GROUP BY POLL_ID ) wv ON p.POLL_ID = wv.POLL_ID;
内容的提问来源于stack exchange,提问作者Mehdi Maazi
相关产品推荐
相关产品推荐

