[英]Mysql re-using sums of subqueries
我有以下簡化的查詢:
Select
(select sum(f1) from tableA a where a.id = t.id) sum1,
(select sum(f2) from tableB b where b.id = t.id) sum2,
t.*
from Table t;
我希望重新使用sum1和sum2而不重新計算它們:
Select
(select sum(f1) from tableA a where a.id = t.id) sum1,
(select sum(f2) from tableB b where b.id = t.id) sum2,
sum1 + sum2 `sum3`,
t.*
from Table t;
當然,我可以執行以下查詢,但這將不必要地使運行時間加倍:
Select
(select sum(f1) from tableA a where a.id = t.id) sum1,
(select sum(f2) from tableB b where b.id = t.id) sum2,
(select sum(f1) from tableA a where a.id = t.id) +
(select sum(f2) from tableB b where b.id = t.id) `sum3`,
t.*
from Table t;
甚至將sum1和sum2結果插入到臨時表中,但無法想象我正在忽略使mysql對求和字段進行一些有效查詢的方法。
有沒有更好,更有效的方法來重用求和字段?
嘗試運行此查詢,
select Resutl.*,Result.sum1+Result.sum2 as sum3 from(
SELECT (SELECT SUM(f1) FROM tableA a WHERE a.id = t.id) sum1,
(SELECT SUM(f2) FROM tableB b WHERE b.id = t.id) sum2,
t.*
FROM Table t)Result
)
希望它會有所幫助。
我的願望是重新使用sum1和sum2而不重新計算它們
哇,堅持下去。 原始查詢效率不如預期。 在不知道數據分布是什么樣的情況下,很難建議最合適的查詢是什么,而是假設A和B中的元組在表T上具有外鍵約束(隱式或顯式),而彼此之間沒有隱式外鍵約束,則t.id是唯一的,然后tableT中的大多數行在tableA和tableB中都有對應的行。
SELECT t.*, sum_f1, sum_f2
FROM tableT t
LEFT JOIN (SELECT a.id, SUM(f1) AS sum_f1
FROM tableA a
GROUP BY a.id) AS a_agg
ON t.id=a_agg.id
LEFT JOIN (SELECT b.id, SUM(f2) AS sum_f2
FROM tableB b
GROUP BY b.id) as b_agg
ON t.id=b_agg.id
GROUP BY t.id
效率會大大提高。 (這也假定禁用了ONLY_FULL_GROUP_BY-否則,您將需要用表中的每個屬性替換SELECT子句中的“ t。*”和group by子句中的“ t.id”)。
請注意,實際上,您很少會在單個查詢中查看所有數據。 由於MySQL無法很好地處理推式謂詞,因此僅在外部SELECT中添加過濾器可能不是最佳解決方案。
一旦按照上述方法構建了查詢,添加總和就很簡單了:
SELECT t.*, sum_f1, sum_f2,
IFNULL(sum_f1,0)+INFULL(sum_f2,0) AS sum3
FROM tableT t
LEFT JOIN (SELECT a.id, SUM(f1) AS sum_f1
FROM tableA a
GROUP BY a.id) AS a_agg
ON t.id=a_agg.id
LEFT JOIN (SELECT b.id, SUM(f2) AS sum_f2
FROM tableB b
GROUP BY b.id) as b_agg
ON t.id=b_agg.id
GROUP BY t.id
(但是請注意,我對您的數據和架構做了很多假設)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.