如何在现有MySQL排名查询中插入COUNT统计获取cnt2字段
解决方案:用条件聚合整合两个统计值
嘿,我来帮你把新增的statistic=1的统计值整合到原查询里!最简洁高效的方式是用条件聚合(带CASE WHEN的COUNT/SUM),不用额外关联表,一次分组就能拿到两个统计结果,性能也更优。
修改后的完整查询语句如下:
SELECT (@rn := @rn + 1) as ranking, p.* FROM ( SELECT player, COUNT(CASE WHEN statistic=0 THEN 1 END) as cnt, -- 统计statistic=0的次数 COUNT(CASE WHEN statistic=1 THEN 1 END) as cnt2 -- 新增:统计statistic=1的次数 FROM test WHERE time > DATE_SUB(now(), INTERVAL 1 MONTH) -- 时间条件统一复用,减少表扫描 GROUP BY player ORDER BY cnt DESC -- 保持原排序逻辑,按statistic=0的次数降序 ) p CROSS JOIN (SELECT @rn := 0) params LIMIT 10;
关键调整说明:
- 把原来单独统计statistic=0的逻辑,改成
COUNT(CASE WHEN statistic=0 THEN 1 END):当statistic等于0时返回1,否则返回NULL,COUNT会自动忽略NULL值,正好统计符合条件的记录数。 - 新增的
cnt2用完全相同的逻辑,只是判断条件改成statistic=1。 - 时间条件保留在WHERE子句中,因为两个统计都需要这个时间范围,这样只需要扫描一次符合时间条件的记录,比分开查询再关联高效得多。
- 排序部分从
ORDER BY COUNT(*) desc改成ORDER BY cnt DESC,语义更清晰,和统计字段对应上。
如果你更习惯用SUM实现(效果完全一致),也可以写成:
SUM(CASE WHEN statistic=0 THEN 1 ELSE 0 END) as cnt, SUM(CASE WHEN statistic=1 THEN 1 ELSE 0 END) as cnt2
两种写法任选其一就行,看你觉得哪个更易读。
内容的提问来源于stack exchange,提问作者Alex K.
相关产品推荐
相关产品推荐

