私はこのクエリを持っています:
SELECT bi.id,
bi.location,
bi.expense_group,
bi.level,
bi.is_active,
bi.type,
full_name,
( bl.bud_amount ) AS BudgetAmount,
( COALESCE(( ( bl.bud_amount * 3 ) - (
+ bal.bal_amount1 + bal.bal_amount2
+ bal.bal_amount3 ) ), 0) ) AS Difference,
( COALESCE(Round(( + bal.bal_amount1 + bal.bal_amount2
+ bal.bal_amount3 ) / 3), 0) ) AS Average,
bal.bal_amount1 AS BAL1,
bal.bal_amount2 AS BAL2,
bal.bal_amount3 AS BAL3
FROM (SELECT *
FROM budget_items bi
WHERE bi.location IS NOT NULL) AS bi
LEFT JOIN (SELECT budget_item_id,
Sum(CASE
WHEN budget_id = 21491 THEN amount
END) AS bud_amount
FROM budget_lines
GROUP BY budget_item_id) AS bl
ON bl.budget_item_id = bi.id
JOIN (SELECT budget_item_id,
Ifnull(Sum(CASE
WHEN balance_id = 12841 THEN amount
END), 0) AS bal_amount1,
Ifnull(Sum(CASE
WHEN balance_id = 18647 THEN amount
END), 0) AS bal_amount2,
Ifnull(Sum(CASE
WHEN balance_id = 18674 THEN amount
END), 0) AS bal_amount3
FROM balance_lines
GROUP BY budget_item_id) AS bal
ON bal.budget_item_id = bi.id
ORDER BY bi.location
時間がかかります。Budget_lines テーブルと balance_lines テーブルには、それぞれ 5,000,000 行以上あります。
クエリの EXPLAIN も添付しますので、問題を確認することができます。すべてのテーブルのすべての ID にインデックスが付けられます。クエリを高速化するためにインデックスが作成される列はありますか? または多分私はそれを変更する必要があります。
*** 残高/予算行テーブルに存在しない場合でも、nudget_items からすべてのアイテムを取得する必要があるため、LEFT JOIN が必要です。
スキーマは次のとおりです。すべての予算にはbudget_linesがあります。すべての残高には、balance_lines があります。このクエリは、予算と複数の残高の違いを要約する 1 つのテーブルを持つことを目的としています。
ここで大きな画像を見ることができます: http://i.stack.imgur.com/dlF8V.png
編集: @Sebas が回答した後:
@sabes の飢餓については、DESCRIBE: Budget_items をここに入力します。
予算_行
バランスライン