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

如何在现有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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:42:51