mysql - 如何改进/简化具有大量子查询的查询?

标签 mysql sql database subquery

我有一个 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

最佳答案

你可以使用 join a 和 group by

     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

关于mysql - 如何改进/简化具有大量子查询的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56876571/

相关文章:

php - 尝试使用 Google SQL Cloud 在 Google App Engine 上运行 Wordpress

mysql - 'b.Hostname' 中的未知列 'on clause'

mysql - 如何从员工表中获得第一高或第二高或第三高的薪水

mysql - LEFT JOIN 查询 MYSQL 不工作

MySQL显示多列的排名

需要 MySQL 数据库结构建议。从一个表到另外两个表的两个多对多,它们处于一对多关系

mysql - 在不同表中使用具有多个条件的 MySQL Count()

php - MySQLi 准备好的语句在相同的常规查询成功的情况下失败

mysql - 规范化超出 MySQL 知识范围?

mysql - 使用 count(*) 创建动态数据透视表查询 mysql