MYSQL - 从2行选择最近的时间

时间:2015-12-08 13:50:37

标签: mysql

我正在为救护车调度系统编写报告段。对于其中一份报告,客户需要在救护车被分配后30分钟内知道患者是否在救护车上。我遇到了一个显示重复行的问题。例如,当调度救护车时,会发生这种情况,但随后将作业取消,直到稍后,然后重新分配。更多信息。

我有一个MySQL查询,如下所示并不完全,但我正在测试:

SELECT J1.id, JL1.entry_time, JL1.resource_status, JL2.entry_time,
JL2.resource_status
FROM jobs J1
INNER JOIN job_logs JL2 ON J1.id = JL2.job_id AND JL2.resource_status = 14
INNER JOIN job_logs JL1 ON J1.id = JL1.job_id AND JL1.resource_status = 5
WHERE JL2.entry_time <= (JL1.entry_time + INTERVAL 30 MINUTE);

如上所述,创建了作业434,在19:01:42分配,取消,然后在19:08:31重新分配。这些是上述查询的结果:

jobid, entry_time(JL1), resource_status(JL1), entry_time(JL2),
resource_status(JL2)
416, 2015-12-01 15:26:52, 5, 2015-12-01 15:32:25, 14
417, 2015-12-01 16:28:19, 5, 2015-12-01 16:35:07, 14
426, 2015-12-01 18:03:09, 5, 2015-12-01 18:04:17, 14
426, 2015-12-01 18:03:09, 5, 2015-12-01 18:04:17, 14
427, 2015-12-01 18:15:38, 5, 2015-12-01 18:15:51, 14
434, 2015-12-03 19:01:42, 5, 2015-12-03 19:01:49, 14
434, 2015-12-03 19:08:31, 5, 2015-12-03 19:01:49, 14
438, 2015-12-07 15:33:06, 5, 2015-12-07 15:35:48, 14
439, 2015-12-08 13:06:37, 5, 2015-12-08 13:06:48, 14`

基本上,我需要一种可以运行查询的方法,但如果返回多个具有相同作业ID的行,则只从最新的行中获取时间。如果时间与作业426相同,则返回一个,但不返回两个。

请记住,我是初级开发人员。我尝试在DISTINCT周围使用J1.id之类的内容,并在AND JL2.entry_time <= JL2.entry_time行的末尾添加INNER JOIN无效。我还和一位对MySQL有更多知识的同事说过,他们也很难过。我不确定我是否应该尝试一下,但我似乎无法在任何地方找到合理的解决方案。

我还考虑在我的页面上执行多个查询,首先选择与资源状态标准“5”匹配的行,然后按最新时间排序,取第一行并将所需数据添加到数组中我的PHP,然后为'14'的resource_status做同样的事情。这将为我提供一个充满单个jobid的数组,每个索引中有2次和2个resource_status'。然后,我必须使用jobid运行另一个查询来收集报告所需的其余数据。显然,运行3个查询而不是单个查询并不理想,我不完全确定运行多个查询的影响有多大而不是一个,如果有的话,我只知道这不是最好的做事方式。如果无法在一个查询中完成,那很好。如果我绝对必须这样做,我可以做多次,但我想我会首先要求确保。

对于多个查询,值得一提的是,某些报告将针对数百行(如果不是数千行)的数据行运行,具体取决于用户指定的时间范围。大多数情况下它是一个月到一个月的报告,因此仅报告11月份的工作,(我计划在解决此问题后添加代码以执行此操作),但在1月份,他们将正在进行全年的“年度报告”。

预先感谢您提供任何帮助,如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

已解决使用:

SELECT  J1.id, MAX(JL1.entry_time), JL1.resource_status, JL2.entry_time, JL2.resource_status
FROM jobs J1
INNER JOIN job_logs JL2 ON J1.id = JL2.job_id AND JL2.resource_status = 14
INNER JOIN job_logs JL1 ON J1.id = JL1.job_id AND JL1.resource_status = 5
WHERE JL2.entry_time <= (JL1.entry_time + INTERVAL 30 MINUTE) 
GROUP BY J1.id
ORDER BY JL1.entry_time;

感谢大家的投入,感谢。