高级MySQL查询分组

时间:2013-06-07 17:40:32

标签: php mysql sql

我有下表

表:项目
字段:id |时间戳|状态

id只是auto inc key
时间戳是m:d:y h:m:s
状态只有1或2个

我要生成如下报告:

Time Passed | Count of status = 1 | Count of status = 2
0-3hrs  |  2 |   9
3-6hrs  |  1 |   5
6-9hrs  |  8 |   14
0-12hrs  |  0 |   99

等等

总而言之,该报告将每个状态(1或2)分为3小时块的总和

我正在做的事情很容易用php来操作数据,但我想知道是否可以用mysql查询来完成

3 个答案:

答案 0 :(得分:2)

SELECT
 CONCAT(
  FLOOR(EXTRACT(HOUR FROM timestamp) / 3)*3, '-',
  FLOOR(EXTRACT(HOUR FROM timestamp) / 3)*3+3, 'hrs'
 ) AS `Time Passed`,
 SUM(status=1) AS `Count of status = 1`,
 SUM(status=2) AS `Count of status = 2`
FROM MyTable
GROUP BY `Time Passed`;

在MySQL 5.5.31上测试过。这是输出:

+-------------+---------------------+---------------------+
| Time Passed | Count of status = 1 | Count of status = 2 |
+-------------+---------------------+---------------------+
| 0-3hrs      |                   2 |                   9 |
| 3-6hrs      |                   1 |                   5 |
| 6-9hrs      |                   8 |                  14 |
| 9-12hrs     |                   0 |                  99 |
+-------------+---------------------+---------------------+

无法保证性能。这必然会进行表扫描。

答案 1 :(得分:0)

只是一个提示。

我会尝试表达时间过去时间:)。

所以我会从:DATEDIFF(hour, timestamp, start_timestamp) / 3开始。

表达式应该在每个下一段时间内从0开始返回自然数。

然后,您可以GROUP BY表达上方和COUNT()状态。

我手边没有MySQL来测试,但我确信有一些功能可以帮到你。

祝你好运!

答案 2 :(得分:0)

您可以截取日期CURRENT_TIMESTAMP,然后通过DATEDIFF()

DATEDIFF(hh, @date1, @date2)

将以小时为单位返回差异

在SQL查询之前声明的SQL function中。

只需一段时间,您就可以用足够的时间来覆盖当天,按日期差异分组并使用COUNT()功能来计算状态。