mysql - 优化包含重复子查询的 MySQL 查询

标签 mysql sql join optimization subquery

我有以下查询现在运行良好,我一直在尝试优化它,因为我使用了 4 次相同的子查询。想出一个更好/更聪明的解决方案会很棒。谢谢

这里是查询:

  select 
     invoices.invoice_id
    ,invoices.invoice_amount
    ,(
      select SUM(invoice_payment_amount) as total
      FROM invoice_payments
      where invoice_payment_invoice_id = invoices.invoice_id
     ) as payments
    ,round((invoices.invoice_amount-(
      select SUM(invoice_payment_amount) as total
      FROM invoice_payments
      where invoice_payment_invoice_id = invoices.invoice_id
     )),2) as balance 
  from invoices
  where (
    round((invoices.invoice_amount - 
         (select SUM(invoice_payment_amount) as total
          FROM invoice_payments
          where invoice_payment_invoice_id = invoices.invoice_id)
          ),2)
      ) > 0 
    or (
    round((invoices.invoice_amount - 
         (select SUM(invoice_payment_amount) as total
          FROM invoice_payments
          where invoice_payment_invoice_id = invoices.invoice_id)
          ),2)
      ) IS NULL
  order by balance

SQL fiddle :http://sqlfiddle.com/#!9/aecea/1

最佳答案

只需使用子查询:

select i.invoice_id, i.invoice_amount, i.payments,
       round((i.invoice_amount- i.payments), 2) as balance
from (select i.*, 
             (select sum(ip.invoice_payment_amount)
              from invoice_payments ip
              where ip.invoice_payment_invoice_id = i.invoice_id
             ) as payments
      from invoices i
     ) i
where round((i.invoice_amount- i.payments), 2) > 0 or
      round((i.invoice_amount- i.payments), 2) is null
order by balance;

为了获得更好的性能,您需要在 invoice_payments(invoice_payment_invoice_id, invoice_payment_amount) 上建立索引。

关于mysql - 优化包含重复子查询的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45661977/

相关文章:

mysql - 如何使用自连接选择最小值和最大值

mysql - SQL 对按另一列分组的列求和

mysql - 如何从本地文件vb.net读取数据库信息

python - Python 程序和 MySQL 之间失去连接

sql - SQL中如何统计一行中的不同字段

sql - 如何在 SQLite 中模拟 REPEAT()

java - 如何使用 JPA Criteria API 加入不相关的实体

python - 根据来自其他两个 DataFrame 的索引合并两个 DataFrame

SQL:添加新的内部联接后,MS Access 查询结果会发生变化

Mysql IN - 所有值都是强制性的,而不是 'OR'