[英]MySQL: GROUP BY within ranges
我有一张分数如下的表格:
score | user
-------------------
2 | Mark
4 | Alex
3 | John
2 | Elliot
10 | Joe
5 | Dude
该表实际上是巨大的,真实分数从1到25。
我需要这个:
range | counts
-------------------
1-2 | 2
3-4 | 2
5-6 | 1
7-8 | 0
9-10 | 1
我已经找到了一些MySQL解决方案,但是它们似乎非常复杂,其中一些甚至建议使用UNION
但是性能非常重要。 如前所述,桌子很大。
所以我想为什么你不简单地拥有这样的查询:
SELECT COUNT(*) as counts FROM score_table GROUP BY score
我得到这个:
score | counts
-------------------
1 | 0
2 | 2
3 | 1
4 | 1
5 | 1
6 | 0
7 | 0
8 | 0
9 | 0
10 | 1
然后使用PHP,求和特定范围的分数计数? 这会使性能更差吗?还是我缺少一个简单的解决方案?
或者,您甚至可以提出一个JavaScript解决方案...
您的解决方案:
SELECT score, COUNT(*) as counts
FROM score_table
GROUP BY score
ORDER BY score;
但是,这不会返回计数值0
。 假设您有所有分数的示例,那么分数的完整列表就不成问题了。 您只是不会得到零计数。
您可以使用类似的方法做您想做的事情:
select (case when score between 1 and 2 then '1-2'
when score between 3 and 4 then '3-4'
. . .
end) as scorerange, count(*) as count
from score_table
group by scorerange
order by min(score);
没有理由在php中进行其他处理。 这种查询对于SQL是非常典型的。
编辑:
根据MySQL文档 ,您可以在group by
使用列别名。 这是确切的报价:
可以在查询选择列表中使用别名来为列指定其他名称。 您可以在GROUP BY,ORDER BY或HAVING子句中使用别名来引用该列:
SELECT SUM(分数在1到2之间的情况然后...
老实说,我无法告诉您这是否比将“ SELECT COUNT(*)作为来自score_table GROUP BY分数的计数”传递到PHP中并让PHP处理它的速度更快...但是它为您的设置增加了一定程度的灵活性。 创建一个三列表作为“ group_ID”,“得分”,“范围”。 在其中插入值以正确分组
1,1,1-2
1,2,1-2
1,3,3-4
1,4,3-4
等等...
加入得分,按范围分组。 添加的“ group_ID”允许您设置组...也许让group 1将其分成两个组,并让group_ID = 2为5个设置范围(或您可能想要的任何值)。
我发现这样的表使用非常快,几乎不需要更改代码,并且如果需要其他分组或分组发生更改,则可以很容易地添加到表中(如果您在代码中进行分组,则需要重做整个case部分)略微更改分组)。
如果您想要一个简单且功能强大的解决方案,请在表格中添加一个额外的字段,并在其中添加一个值作为分数,以便1和2的值分别为1、3和4的值为2。 。 只有插入分数,您才需要添加一个额外的字段。 因此您的表如下所示:
score | user | range
--------------------------
2 | Mark | 1
4 | Alex | 2
3 | John | 2
2 | Elliot | 1
10 | Joe | 5
5 | Dude | 3
现在您可以执行以下操作:
select count(score),range from table group by range;
如果您有一个选择优先的应用程序,这总是更快。
通过插入执行此操作:
$scoreRange = 2;
$range = ceil($score/$scoreRange);
这个怎么样:
select concat((score + (1 * (score mod 2)))-1,'-',(score + (1 * (score mod 2)))) as score, count(*) from TBL1 group by (score + (1 * (score mod 2)))
您可以看到它在此提琴中起作用: http ://sqlfiddle.com/#! 2/215839/6
对于输入
score | user
-------------------
2 | Mark
4 | Alex
3 | John
2 | Elliot
10 | Joe
5 | Dude
它生成此:
range | counts
-------------------
1-2 | 2
3-4 | 2
5-6 | 1
9-10 | 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.