Как улучшить / упростить запрос с большим количеством подзапросов? - PullRequest
1 голос
/ 03 июля 2019

У меня есть SQL-запрос, который суммирует и подсчитывает некоторые регистры из моей базы данных, проблема в том, что я использую много подзапросов, и все они имеют одинаковое условие, мне нужно найти лучшее решение, потому что это вызываетмедлительность в моей системе.

Я пытался использовать простое левое соединение, но mysql возвратил одну строку, и я хочу, чтобы он подсчитывал и суммировал каждый регистр в таблице dbgeneralesImportacion.

У меня есть что-то вроде этого:

SELECT  dbgeneralesImportacion.id,
        sapito.dbgeneralesImportacion.documentosCompletos AS 'documentosCompletos', 
        (SELECT COUNT(c.id) 
        FROM sapito.dbcontenedores c 
        WHERE c.operacion = dbgeneralesImportacion.id ) AS 'ContadorContenedores', 
        (SELECT SUM(IF(c.estatus = 1, 1, 0)) 
        FROM sapito.dbcontenedores c 
        WHERE c.operacion = dbgeneralesImportacion.id ) AS 'ContadorDespachos', 
        (SELECT SUM(IF(c.estatus = 2, 1, 0)) 
        FROM sapito.dbcontenedores c 
        WHERE c.operacion = dbgeneralesImportacion.id ) AS 'ContadorCompletado', 
        (SELECT SUM(IF(c.desconsolidacion = 1, 1, 0)) 
        FROM sapito.dbcontenedores c 
        WHERE c.operacion = dbgeneralesImportacion.id ) AS 'DesconsolidacionPuerto',
        (SELECT SUM(c.bultos) FROM sapito.dbcontenedores c WHERE c.operacion = dbgeneralesImportacion.id)  AS 'bultos'
FROM    dbgeneralesImportacion

And my idea was to do this but counts all register and return a single row:

SELECT  dbgeneralesImportacion.id AS 'id',
        COUNT(c.id) AS 'ContadorContenedores', 
        SUM(IF(c.estatus = 1, 1, 0))  AS 'ContadorDespachos', 
        SUM(IF(c.estatus = 2, 1, 0))  AS 'ContadorCompletado', 
        SUM(IF(c.desconsolidacion = 1, 1, 0))  AS 'DesconsolidacionPuerto',
        SUM(c.bultos)  AS 'bultos'
FROM    dbgeneralesImportacion
        LEFT JOIN dbcontenedores c ON c.operacion = dbgeneralesImportacion.id

Thank you everyone

Ответы [ 3 ]

2 голосов
/ 03 июля 2019

Вы можете использовать объединение и группу

     SELECT  a.id
         , a.documentosCompletos
         , COUNT(c.id) ContadorContenedores
         , SUM(IF(c.estatus = 1, 1, 0)) ContadorDespachos
         , SUM(IF(c.estatus = 2, 1, 0)) ContadorCompletado
         , SUM(IF(c.desconsolidacion = 1, 1, 0)) DesconsolidacionPuerto
         ,  SUM(c.bultos) bultos

     FROM    dbgeneralesImportacion a
     INNER JOIN sapito.dbcontenedores c ON c.operacion = a.id
     GRUP BY a.id, a.documentosCompletos
1 голос
/ 03 июля 2019

Не позитивно, но не могли бы вы сделать что-то подобное

SELECT  dbgeneralesImportacion.id,
sapito.dbgeneralesImportacion.documentosCompletos AS 'documentosCompletos', 
COUNT(c.id)  AS 'ContadorContenedores', 
SUM(IF(c.estatus = 1, 1, 0)) AS 'ContadorDespachos', 
SUM(IF(c.estatus = 2, 1, 0)) AS 'ContadorCompletado', 
SUM(IF(c.desconsolidacion = 1, 1, 0)) AS 'DesconsolidacionPuerto',
SUM(c.bultos) AS 'bultos'

FROM    dbgeneralesImportacion, sapito.dbcontenedores c

WHERE c.operacion = dbgeneralesImportacion.id 
GROUP BY dbgeneralesImportacion.id
0 голосов
/ 03 июля 2019

Вам нужно GROUP BY, но вы также можете упростить запрос:

SELECT gi.id AS id,
       COUNT(c.id) AS ContadorContenedores, 
       SUM( c.estatus = 1 )  AS ContadorDespachos, 
       SUM( c.estatus = 2 )  AS ContadorCompletado, 
       SUM( c.desconsolidacion = 1 )  AS DesconsolidacionPuerto,
       SUM(c.bultos)  AS bultos
FROM dbgeneralesImportacion LEFT JOIN
     dbcontenedores c 
     ON c.operacion = gi.id
GROUP BY gi.id;

MySQL рассматривает логические значения как числа в числовом контексте, где true равно 1, а false равно 0. Это упрощает подсчет совпадающих значений.

Кроме того, используйте только одинарные кавычки для констант строки и даты. Использование их для псевдонимов столбцов может привести к трудным для отладки проблемам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...