如何優化聯合和聯接查詢?是否有可能在聯盟之外移動一些聯接?優化聯合查詢中的聯接
(
SELECT accounting.id, accounting.time, accounting.subaccount_id AS module_id, accounting.balance_invoice_id AS balance_id, accounting.currency_amount*-1 AS currency_amount, accounting.amount*-1 AS amount, enclosure.enc_id_, enclosure.txt, currency.name AS currency_name, IF(balance_invoice.amount, accounting.currency_amount*-1+SUM(balance_invoice.amount), accounting.currency_amount*-1) AS balance
FROM accounting
INNER JOIN enclosure ON enclosure.id=accounting.enc_id
LEFT JOIN currency ON currency.id=accounting.currency_id
LEFT JOIN balance_invoice ON balance_invoice.accounting_id=accounting.id
WHERE accounting.att_booked=1
GROUP BY accounting.id
)
UNION (
SELECT accounting.id, accounting.time, accounting.subaccountoff_id AS module_id, accounting.balanceoff_invoice_id AS balance_id, accounting.currency_amount, accounting.amount, enclosure.enc_id_, enclosure.txt, currency.name AS currency_name, IF(balance_invoice.amountoff, accounting.currency_amount+SUM(balance_invoice.amountoff), accounting.currency_amount) AS balance
FROM accounting
INNER JOIN enclosure ON enclosure.id=accounting.enc_id
LEFT JOIN currency ON currency.id=accounting.currency_id
LEFT JOIN balance_invoice ON balance_invoice.accounting_id=accounting.id
WHERE accounting.att_booked=1 && accounting.type IN (0,1,2)
GROUP BY accounting.id
) ORDER BY time DESC
您的查詢在SELECT子句中包含'GROUP BY accounting.id'子句和許多未聚合的字段。 MySQL允許它,但它不正確;檢查它,也許重寫你的查詢。 – Devart 2012-03-14 10:15:10