将多个SQL查询组合到MySQL中的单个查询中

时间:2014-02-01 06:21:45

标签: php mysql sql join

MySQL版本15.1 Distrib 10.0.7-MariaDB,在Debian-linux上运行。

我正在将5分钟的发电数据收集到MySQL数据库中,并希望修改每日报告SQL查询。 GenerationData表中的典型日期数据如下所示:

--------++------------+---------------------+
| id     | Generation | DispatchInterval    |
+--------+------------+---------------------+
| 321888 |        0.0 | 2014-01-28 22:15:00 |
| 321887 |        0.0 | 2014-01-28 22:10:00 |
| 321886 |      72 .0 | 2014-01-28 22:05:00 |
| 321885 |      99.37 | 2014-01-28 22:00:00 |
.       .       .       
.       .       .       
| 321679 |     51.375 | 2014-01-28 10:50:00 |
| 321678 |     30.375 | 2014-01-28 10:45:00 |
| 321677 |         12 | 2014-01-28 10:40:00 |
| 321676 |        0.0 | 2014-01-28 10:35:00 |
| 321675 |        0.0 | 2014-01-28 10:30:00 |
+--------+------------+---------------------+

因此,每当有任何一代人的时候,将会有288条记录从“2014-01-28 00:00:00”开始并在“2014-01-28 23:55:00”结束,每条记录都有一个独特的id和Generation阅读(以及为清晰起见而排除的其他一些领域)

我使用类似

的查询创建每日生成报告
select date(DispatchInterval) as RunDate, max(Generation) as MaxGeneration,      
sum(Generation)/12 as MWH 
from GenerationData 
group by date(DispatchInterval) 
order by date(DispatchInterval) desc LIMIT 0, 4;

+------------+---------------+---------+
| RunDate    | MaxGeneration | MWH     |
+------------+---------------+---------+
| 2014-01-28 |        494.25 | 4334.12 |
| 2014-01-27 |        506.25 | 3032.56 |
| 2014-01-17 |         466.5 | 6178.75 |
| 2014-01-16 |       500.625 | 7733.72 |
+------------+---------------+---------+

我想要做的是扩展查询以包括每天的启动和关机时间,例如:

+------------+---------------+---------+----------+----------+
| RunDate    | MaxGeneration |   MWH   | Startup  | Shutdown |
+------------+---------------+---------+----------+----------+
| 2014-01-28 |        494.25 | 4334.12 | 10:40:00 | 22:10:00 |
| 2014-01-27 |        506.25 | 3032.56 | 06:25:00 | 23:30:00 |
| 2014-01-17 |         466.5 | 6178.75 | 11:40:00 | 22:05:00 |
| 2014-01-16 |       500.625 | 7733.72 | 03:15:00 | 19:55:00 |
+------------+---------------+---------+----------+----------+

每天可能有多次启动和关机,但我对第一次启动和上次关机感到满意。 我可以通过查找生成值从< 2到> 2(以允许读数中的噪声)的转换来获得启动或关闭时间(但不是相同的查询)

select date(a.DispatchInterval), time(b.DispatchInterval) as StartTime
from GenerationData a
join GenerationData b on 
    b.DispatchInterval=DATE_ADD(a.DispatchInterval,INTERVAL 5 MINUTE)
    and b.Generation>2 and a.Generation<2
group by date(a.DispatchInterval)
order by date(a.DispatchInterval) desc limit 0,4

+--------------------------+---------------------+
| date(a.DispatchInterval) | StartTime           |
+--------------------------+---------------------+
| 2014-01-28               | 10:40:00            |
| 2014-01-27               | 06:25:00            |
| 2014-01-15               | 06:00:00            |
| 2014-01-14               | 09:55:00            |
+--------------------------+---------------------+

但我对各种连接没有运气,可能是因为“MWH”的“分组依据”条款。 显然我是一个SQL菜鸟。

所以我的问题是如何组合查询(或者可能提出完全不同的策略)来实现预期的结果? 查询将从PHP脚本执行,我已经考虑使用PHP来检测启动和关闭时间并将它们添加到响应中,但我更愿意先耗尽所有SQL选项。

非常感谢您提供的任何提示。

1 个答案:

答案 0 :(得分:0)

解决了!我一直在寻找没有必要的复杂性,在这种情况下,连接是完全没有必要的,但是沿着那条路走下去,我对显而易见的事情视而不见。简单的查询是

select date(DispatchInterval) as RunDate, max(Generation) as MaxGeneration,
sum(Generation)/12 as MWH,
time(min(DispatchInterval)) as StartUp,
time(max(DispatchInterval)) as Shutdown
from GenerationData group by RunDate desc

+------------+---------------+------------+----------+----------+
| RunDate    | MaxGeneration | MWH        | StartUp  | Shutdown |
+------------+---------------+------------+----------+----------+
| 2014-02-02 |       499.875 |   1025.375 | 00:00:00 | 15:10:00 |
| 2014-01-28 |        494.25 |   4334.125 | 00:00:00 | 23:55:00 |
| 2014-01-27 |        506.25 |  3032.5625 | 00:00:00 | 23:55:00 |
| 2014-01-17 |         466.5 |    6178.75 | 00:00:00 | 23:55:00 |
| 2014-01-16 |       500.625 | 7733.71875 | 00:00:00 | 23:55:00 |
+------------+---------------+------------+----------+----------+

有时候你只需要离开并做一些其他事情。