SQL组不按预期工作

时间:2015-09-27 05:09:28

标签: php mysql sql

我对此感到头疼,我在本查询中有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相同的值,因为它们都没有在记录的表上有活动。

http://sqlfiddle.com/#!9/9cc1dc/1

2 个答案:

答案 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;