【问题标题】:Combining multiple SQL queries into a single query in MySQL在 MySQL 中将多个 SQL 查询组合成一个查询
【发布时间】:2026-02-08 14:40:01
【问题描述】:

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 |
+------------+---------------+---------+----------+----------+

每天可能会有多次启动和关闭,但我会对第一次启动和最后一次关闭感到满意。 我可以通过查找 Generation 值从 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”的“Group by”子句。 显然我是一个 SQL 菜鸟。

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

如果您能提供任何提示,我们将不胜感激。

【问题讨论】:

  • 您需要发布正确的示例数据,这些数据才能真正生成您发布的结果。仅放置 ... 是不够的。提供数据,让用户尝试
  • 嗨,raheel,一整天包含 288 条记录,从 "yyyy-mm-dd 00:00:00" 到 "yyyy-mm-dd 23:55:00" - 要粘贴的内容很多而且我看不到任何附加文件的选项。 ... 表示确切的值并不重要,只是 DispatchInterval 增加 5 分钟,Generation 随时间上升和下降。

标签: php mysql sql join


【解决方案1】:

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

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 |
+------------+---------------+------------+----------+----------+

有时你只需要离开一段时间去做点别的事情。

【讨论】: