[英]Selecting a summed value from a subquery that relies on a joined table
因此,我很幸運,能夠為我們的應用程序優化查詢,而該查詢對於我們獲取的數據來說花費的時間太長了。 我們正在尋找的數據不是很復雜,但是糟糕的數據庫設計使它變得比原本要困難得多(這很棒,因為我是大約一年前設計過的人)。
總體思路是,我們正在嘗試計算每個客戶的總銷售額(他們購買了可以增加其余額的商品)和總付款額(他們用他們的余額支付了款項)。
表格:
顧客
銷售(發票) :
付款(帳戶付款)
交易(invoice_transactions)
如果用戶進行銷售 ,則該信息會記錄在invoices
和invoice_transactions
,其中invoice_transactions的發票記錄的invoice_id包含customer_id。
如果用戶付款 ,該信息將記錄在account_payments
和invoice_transactions
,其中invoice_transaction的invoice_id為NULL,而account_payments包含transaction_id和customer_id。
我知道,這太可怕了……我還以為自己很聰明! 好吧,我解決了問題,並提出了一個不錯的解決方案:
SELECT SQL_NO_CACHE
c.company,
(SELECT SUM(amount) FROM sales),
(SELECT SUM(amount) FROM payments)
FROM customers c
JOIN invoices i ON i.customer_id = c.id
JOIN invoice_transactions sales ON i.invoice_id = sales.id
JOIN account_payments ap ON ap.customer_id = c.id
JOIN invoice_transactions payments ON ap.transaction_id = payments.id
除了給我一個錯誤“#1146-表'db.sales'不存在”之外,該命令什么都不做。 我猜想這與聯接之前讀取子查詢有關,但是老實說我不知道。 不幸的是,我不知道解決這個問題的另一種方法。如果有人可以幫助我,我將不勝感激!
我認為最好的方法是將“銷售”和“付款”元素分成子查詢,您當前的方法是在進行匯總之前將所有付款與所有發票交叉連接。
SELECT c.ID,
c.Company,
COALESCE(Sales.Amount, 0) AS Sales,
COALESCE(Payments.Amount, 0) AS Payments
FROM Customers c
LEFT JOIN
( SELECT Customer_ID, SUM(Amount) AS Amount
FROM Invoices
INNER JOIN invoice_transactions
ON Invoice_ID = Invoices.ID
GROUP BY Customer_ID
) As Sales
ON Sales.Customer_ID = c.ID
LEFT JOIN
( SELECT Customer_ID, SUM(Amount) AS Amount
FROM Account_Payments
INNER JOIN invoice_transactions tr
ON tr.ID = Transaction_ID
GROUP BY Customer_ID
) AS Payments
ON Payments.Customer_ID = c.ID;
這將包括沒有發票也沒有付款的客戶。 您可以將左聯接更改為內部聯接以進行操作。
您的查詢沒有任何意義。
完成所有聯接之后,為什么不只使用“ from”子句中的表:
SELECT c.company, SUM(sales.amount), SUM(payments.amount)
FROM customers c JOIN invoices i ON i.customer_id = c.id JOIN
invoice_transactions sales ON i.invoice_id = sales.id JOIN
account_payments ap ON ap.customer_id = c.id JOIN
invoice_transactions payments ON ap.transaction_id = payments.id
group by c.company
僅在“ from”子句中為表賦予別名,並不能使其在查詢中其他位置的子查詢中可用。
我還添加了GROUP BY子句,因為您的查詢似乎是按公司匯總的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.