我对此感到头疼,我在本查询中有2个表格,出于上下文目的,让我描述一下我尝试用这个做什么。
我正在构建一个仪表板,它将显示每个进程必须通过的特定订单的时间量,在这种情况下,我有4个进程,并且它没有通过进程它需要显示该时间之前的金额(这是一个通过网络浏览器每秒查询的查询。
所以我的问题是,在计算时间的第一个过程中,如果每个订单没有注册活动,它将从注册日期(FechaRegistro)开始显示,但出于某种原因,如果我在第一个过程中有多个订单只有第一个显示正确,其余的将显示一个NULL值,其余的进程正常工作,它只是我遇到问题的第一个。
Ordenes表
Id Numero flujo_id LastOrder FechaRegistro
18 2 1 0 2015-09-26 19:13:27
19 3 1 0 2015-09-26 19:14:04
20 4 1 0 2015-09-26 19:14:14
Actividad表:
Id TiempoInicio Proceso_Id Orden_Id
1 2015-09-26 20:07:26 1 20
QUERY
SELECT
Ordenes.Id, Numero, FechaRegistro, m.P1, a.P2, b.P3, c.P4
FROM
Ordenes
LEFT JOIN
(SELECT
Ordenes.id,
IF(MIN(Actividad.TiempoInicio) IS NULL,SEC_TO_TIME(timestampdiff(SECOND,Ordenes.FechaRegistro,now())) ,SEC_TO_TIME(TIMESTAMPDIFF(SECOND, Ordenes.FechaRegistro, MIN(Actividad.TiempoInicio)))) as P1
FROM
Ordenes
LEFT JOIN Actividad ON Ordenes.id = Actividad.Orden_id
GROUP BY Actividad.Orden_id) AS m ON Ordenes.id = m.id
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P2
FROM
Actividad
WHERE
Proceso_Id IN ('1' , '2')
GROUP BY Orden_id) AS a ON Ordenes.id = a.Orden_id
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P3
FROM
Actividad
WHERE
Proceso_Id IN ('2' , '3')
GROUP BY Orden_id) AS b ON Ordenes.id = b.Orden_id
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P4
FROM
Actividad
WHERE
Proceso_Id IN ('3' , '4')
GROUP BY Orden_id) AS c ON Ordenes.id = c.Orden_id
ORDER BY id
输出:
ID Numero FechaRegistro P1 P2 P3 P4
18 2 2015-09-26 19:13:27 00:54:38 NULL NULL NULL
19 3 2015-09-26 19:14:04 NULL NULL NULL NULL
20 4 2015-09-26 19:14:14 00:53:12 00:00:39 NULL NULL
所需的结果应该在Id 19中的P1上显示与18相同的值,因为它们都没有在记录的表上有活动。
答案 0 :(得分:1)
尝试使用您的subquerys中的GROUP BY
答案 1 :(得分:0)
所以我实际上无法解决问题,但我确实设法得到了我想要的结果,改变了一点我的逻辑,我在活动表中得到了registrationDate,进程ID为0,并使下一个SQL
SELECT
Ordenes.Id, Numero, FechaRegistro, m.P1, a.P2, b.P3, c.P4,(FechaRegistro) as Cierre
FROM
Ordenes
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P1
FROM
Actividad
WHERE
Proceso_Id IN ('0' , '1')
GROUP BY Orden_id) AS m ON Ordenes.id = m.Orden_id
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P2
FROM
Actividad
WHERE
Proceso_Id IN ('1' , '2')
GROUP BY Orden_id) AS a ON Ordenes.id = a.Orden_id
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P3
FROM
Actividad
WHERE
Proceso_Id IN ('2' , '3')
GROUP BY Orden_id) AS b ON Ordenes.id = b.Orden_id
LEFT JOIN
(SELECT
Orden_Id,
IF(MIN(TiempoInicio)=MAX(TiempoInicio),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), now())),SEC_TO_TIME(TIMESTAMPDIFF(SECOND, MIN(TiempoInicio), MAX(TiempoInicio)))) as P4
FROM
Actividad
WHERE
Proceso_Id IN ('3' , '4')
GROUP BY Orden_id) AS c ON Ordenes.id = c.Orden_id
ORDER BY id;