【问题标题】:Optimizing MySQL query that includes a repeated subquery优化包含重复子查询的 MySQL 查询
【发布时间】:2017-08-14 00:07:51
【问题描述】:

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

这里是查询:

选择 invoices.invoice_id ,invoices.invoice_amount ,( 选择 SUM(invoice_payment_amount) 作为总计 FROM invoice_payments 其中 invoice_payment_invoice_id = invoices.invoice_id ) 作为付款 ,round((invoices.invoice_amount-( 选择 SUM(invoice_payment_amount) 作为总计 FROM invoice_payments 其中 invoice_payment_invoice_id = invoices.invoice_id )),2) 作为平衡 从发票 在哪里 ( 回合((发票.invoice_amount - (选择 SUM(invoice_payment_amount) 作为总计 FROM invoice_payments 其中 invoice_payment_invoice_id = invoices.invoice_id) ),2) ) > 0 或者 ( 回合((发票.invoice_amount - (选择 SUM(invoice_payment_amount) 作为总计 FROM invoice_payments 其中 invoice_payment_invoice_id = invoices.invoice_id) ),2) ) 一片空白 按余额排序

SQL 小提琴:http://sqlfiddle.com/#!9/aecea/1

【问题讨论】:

  • 使用 MariaDB 10.2 或 MySQL 8.0,您可以使用 CTE。

标签: mysql sql join optimization subquery


【解决方案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) 上建立索引。

【讨论】:

  • 按预期工作,一半时间的结果相同。 link 谢谢戈登。我只是在 where 子句中添加了一个缺失的“或”。
猜你喜欢
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
相关资源
最近更新 更多