2016-08-04 9 views
0

私は、次の単純化されたクエリがある:MySQLの再利用合計

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はそれらを再度計算することなく再利用することです。もちろん、iの

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; 

次のクエリを実行できますが、これは実行時間を2倍にする必要はありません。

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 res私は一時的なテーブルにultsがイメージング私は何かを見落としていることができないmysqlは、いくつかの効率的なクエリを集計フィールドで行う。

合計フィールドを再利用する方が、より効率的で効率的な方法はありますか?

答えて

1

は、このクエリを実行してみてください、

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 
) 

はそれに役立つことを願っています。

0

私の願いは、SUM1とSUM2に着実再び

おっとを、それらを計算することなく再使用することです。元のクエリは効率的ではありません。最も適切なクエリが何であるかをアドバイスするのは難しいが、AとBのタプルはテーブルTに外部キー制約(暗黙的または明示的)があるが、相互に暗黙的な外部キー制約はないと仮定すると、 t.idは一意であり、tableTの行の大部分はtableAとtableBに対応する行を持ちます。

これははるかに効率的です。 (これは、ONLY_FULL_GROUP_BYが無効であることも前提としています。そうでなければ、SELECT節の 't。*'と、テーブルから必要な属性のあるgroup by節の 't.id'を置き換える必要があります)。

実際にはすべてのデータを1つのクエリで見ることはめったにありません。 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 

(私はあなたのデータとスキーマに関する仮定のたくさんを作ったことに注意してください)