tinyint列特定值统计结果异常:如何正确统计正负投票数
问题分析与解决
你的统计结果异常是因为使用了COUNT(DISTINCT vote = 1),这个写法的核心问题在于:
vote = 1是布尔表达式,在MySQL中会返回1(条件成立)或0(条件不成立)COUNT(DISTINCT ...)会对表达式的结果去重,不管有多少条符合条件的记录,去重后仅会保留1和0两个值,最终统计结果自然为2,和实际需要统计的数量完全不符。
正确的统计写法
方法1:用SUM()直接统计符合条件的行数
SELECT SUM(vote = 1) AS like_count, SUM(vote = -1) AS dislike_count FROM vote_table;
原理:当vote = 1条件成立时返回1,不成立时返回0,SUM会将所有符合条件的1累加,最终得到的就是目标记录的总数量。
方法2:CASE语句配合COUNT()
SELECT COUNT(CASE WHEN vote = 1 THEN 1 END) AS like_count, COUNT(CASE WHEN vote = -1 THEN 1 END) AS dislike_count FROM vote_table;
原理:CASE仅在条件满足时返回1,否则返回NULL;而COUNT()不会统计NULL值,因此能精准得到符合条件的记录数。
方法3:分组统计(按需选择)
如果需要同时查看各类别的具体数量,也可以用GROUP BY:
SELECT vote, COUNT(*) AS count FROM vote_table WHERE vote IN (1, -1) GROUP BY vote;
内容的提问来源于stack exchange,提问作者Toniq
相关产品推荐
相关产品推荐

