如何在不需要在 mysql 中使用多个查询的情况下计算一个范围的 COUNT(*)

Tar*_*run 7 mysql

我正在使用 MySQL,我需要帮助将 COUNT(*) 用于表中的一系列值。

我有一个名为 PERSON 的表(在实时系统中,我希望有几十万或更多的记录)。

Name    Result
a       100
b       130.45
c       182.96
d       65.45
e       199
f       245
Run Code Online (Sandbox Code Playgroud)

我需要查询表以找出属于给定范围的记录数。例如,有多少人属于 0-50 范围。范围值是动态的。所以预期的结果是这样的:

Range       Count
0-50            0
51-100          2
101-150         1
151-200         2
201-250         1
Run Code Online (Sandbox Code Playgroud)

当然,我可以这样做:

SELECT COUNT(*) FROM PERSON WHERE RESULT <= 50
SELECT COUNT(*) FROM PERSON WHERE RESULT > 50 AND RESULT <= 100 
Run Code Online (Sandbox Code Playgroud)

等等所有范围......

但是,必须有更好、更有效的方法来做到这一点吗?

小智 11

使用case你可以定义任何你想要的范围。

select 
  case 
    when RESULT between 0 and 50 then '0-50'
    when RESULT between 50 and 100 then '51-100'
    when RESULT between 100 and 150 then '101-150'
    when RESULT between 150 and 200 then '151-200'
    when RESULT between 200 and 250 then '201-250'
    else 'OTHERS'
  end as `Range`,
  count(1) as `Count`
from PERSON
group by `Range`;
Run Code Online (Sandbox Code Playgroud)


a1e*_*x07 3

除非我在分组计算中犯了错误(抱歉,我现在无法测试它),否则你可以使用类似的东西

SELECT CONCAT(grp_id*50+IF(grp_id>0,1,0),'-',(grp_id+1)*50) as `Range`, cnt as `Count`
FROM
(
  SELECT floor(IF(Result-1<0,0,Result-1)/50) as grp_id, COUNT(*) as cnt
  FROM PERSON
  GROUP BY floor(IF(Result-1<0,0,Result-1)/50)
 )a
Run Code Online (Sandbox Code Playgroud)

并不真正需要派生表,我在这里使用它只是为了清楚起见