簡體   English   中英

MySQL重用子查詢的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM