php - 显示数据库表中的动态范围并计算每个范围内的行数

标签 php mysql sql

我有这样的数据库表:

enter image description here

我想显示不同的 5 岁年龄范围和该范围内的学生人数,如下所示:

enter image description here

在这里,最低年龄是 10 岁,所以我们首先计算 10-15 岁的范围。该范围内有 5 名学生。对于第二个范围,我们需要找到 age>15,即 18。因此,第二个范围是 18-23,依此类推。如果能自动计算范围并计算该范围内的数据,我将不胜感激。

最佳答案

您可以在 SUM() 语句中使用条件来获取满足该条件的计数。我会计算年龄在 BETWEEN() 必要范围内的条件。试试这个:

SELECT 
  SUM(age BETWEEN 10 AND 15) AS '10-15',
  SUM(age BETWEEN 18 AND 23) AS '18-23',
  SUM(age BETWEEN 26 AND 31) AS '26-31',
  SUM(age BETWEEN 34 AND 39) AS '34-39'
FROM myTable;

这只会返回一行,但它会包含您需要的一切。这是一个 SQL Fiddle示例。

编辑 我误解了您自动计算各种范围的问题。我将在这里留下我之前的回答,因为它可能对 future 寻找硬编码范围的读者有所帮助。为此,您必须设置一个变量。我采用了一种运行总计类型的方法来获取组。我首先在查询之前将 @a 设置为 0。然后,我需要获得两个值:

  • 年龄 > @a 的表中的最小年龄
  • 5 大于该变量。

我通过根据需要更改@a 的值来做到这一点:

  • @a := (SELECT MIN(age) FROM myTable WHERE age >= @a)
  • @a := @a + 5

然后,我将这些包含在 CONCAT() block 中并将这些值转换为字符以获得我需要的组。它可能看起来很复杂,所以我希望我解释了这个概念:

SELECT CONCAT
   (CAST(@a := (SELECT MIN(age) FROM myTable WHERE age > @a) AS CHAR), 
   ' - ', 
   CAST((@a := @a + 5) AS CHAR)) AS ageRange
FROM myTable
WHERE @a <= (SELECT MAX(age) FROM myTable);

这样做给了我四行,每一行都有你期望的年龄范围。我必须添加 where 子句,否则我会为表中的每一行得到一个结果行,这会给我们几个空行。

最后,我加入了一个子查询来计算年龄在必要范围内的学生人数。请注意,第一部分更改了@a 的值,因此我不是从@a 检查到@a + 5,而是从@a-5 检查到@a。这是最终查询:

SET @a = 0;
SELECT CONCAT(CAST(@a := (SELECT MIN(age) FROM myTable WHERE age > @a) AS CHAR), ' - ', CAST((@a := @a + 5) AS CHAR)) AS ageRange,
  (SELECT COUNT(*) FROM myTable WHERE age BETWEEN @a - 5 AND @a) AS numStudents
FROM myTable
WHERE @a <= (SELECT MAX(age) FROM myTable)
GROUP BY ageRange;

它在 SQL Fiddle 中表现出色.完全动态并返回各种 5 组,而无需事先知道要采取哪些组。

关于php - 显示数据库表中的动态范围并计算每个范围内的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769211/

相关文章:

mysql - 线性回归,在 MySQL 中寻找斜率

Mysql只有满足条件才插入

mysql - Doctrine2 - 哪种方法更合适?

sql - 跨数据库联合

phpmyadmin - apache2.4 + php-fpm + debian 中的 phpmyadmin

javascript - AJAX 似乎比我的其他代码运行得更快

php - Aptana Studio 3 是否支持启动或预览 PHP 应用程序?

php - 如何在 jQuery 中重定向页面?

c# - 使用 SQL 在两个表单之间传递数据

sql - 在 Excel 中编辑 doc 文件数据连接到存储过程