mysql/php:按类分组

mysql/php:按类分组,php,mysql,Php,Mysql,我有一个带有百分比(值为0-100)的表(假设表名=TableA,其中只有一列名为percent) 我想做的是在课堂上划分百分比。例如,假设类宽度=2。我的最终结果是: percent | quantity ------------------ [0-2) | 5 [2-4) | 43 ... | ... [96-98) | 232 [98-100]| 173 我已经想到了一些方法,但是我需要一个有效的方法,考虑到表包含大约500000行。 最后,我将用php创建一个图表,所以

我有一个带有百分比(值为0-100)的表(假设表名=TableA,其中只有一列名为percent)

我想做的是在课堂上划分百分比。例如,假设类宽度=2。我的最终结果是:

percent | quantity
------------------
[0-2)   | 5
[2-4)   | 43
...     | ...
[96-98) | 232
[98-100]| 173
我已经想到了一些方法,但是我需要一个有效的方法,考虑到表包含大约500000行。 最后,我将用php创建一个图表,所以我并不关心解决方案是基于mysql还是基于php

1) (好吧,这肯定不是最好的,但我写这篇文章是为了清楚地说明我的要求)

然后

select tableB.floor/2,count(*) 
from tableA join tableB 
on tableA.percent>=tableB.floor and tableA.percent<tableB.roof
group by tableB.floor/2
选择表B.楼层/2,计数(*)
从表A连接表B

在tableA.percent>=tableB.floor和tableA.percent中,您可以使用公式创建直方图存储桶,而无需第二个表的帮助

SELECT count(*), FLOOR(percent/2)*2 percent
  FROM tableA
 GROUP BY FLOOR(percent/2)*2
 ORDER BY FLOOR(percent/2)*2
这应该是非常有效的,尤其是当您的
百分比
列上碰巧有一个索引时


例如,
percent
值18和19将由GROUP by公式转换为18。

回答正确,+1。只有GROUP BY和ORDER BY子句中的
*2
似乎是多余的—无论您是按0、2、4……还是0、1、2……进行分组和排序,都应该没有任何区别。(另一方面,这样一个简单的数学运算很可能几乎不花费任何成本,因此,为了保持查询的一致性和更好的可理解性,乍一看,人们可能只想将其保留在查询中。)正确:*2乘法用于结果集中的显示目的。我有一个习惯,从多年的甲骨文黑客攻击中学到的,总是在SELECT和GROUP BY中使用相同的表达式。
floor | roof
------------
0     | 2
2     | 4
4     | 6
...   | ...
select tableB.floor/2,count(*) 
from tableA join tableB 
on tableA.percent>=tableB.floor and tableA.percent<tableB.roof
group by tableB.floor/2
SELECT count(*), FLOOR(percent/2)*2 percent
  FROM tableA
 GROUP BY FLOOR(percent/2)*2
 ORDER BY FLOOR(percent/2)*2