2016-10-06 3 views
0

データを効率的に取り出すために必要な2つのテーブルがあります。2つのテーブルを同じテーブルにジョインするときに合計を計算する

TableA 
id 
full_name 

TableB 
table_a_id_1 
table_a_id_2 
amount1 
amount2 

TableBのは、(彼らは同じになることはありません)

私は(N + 2のクエリを避けるためにしようと、あるいは最も効率的なクエリ)1つのクエリを記述しようとしています取得するにはTableAの上に2つの異なるレコードを参照します

[{id: 1, full_name: 'bob', 1_sum1: 50.0, 1_sum2: 30.0, 2_sum1: 1.0, 2_sum2: 25.0}] 

どこ:合計合計とTableAの中のすべてのレコードのリストTableBの

対応するためには、このようになります210 IDとFULL_NAMEは、テーブルA

1_sum1、1_sum2からのものである、両方table_a_id_1 = TableA.id

2_sum1テーブルBから合計列2_sum2共にtable_a_id_2 = TableA.id

テーブルBから列を加算され私はこれが混乱しないことを本当に望む。

results = TableA. 
joins('LEFT JOIN table_b t1_stats ON t1_stats.t1_aff_id = table_a.id'). 
joins('LEFT JOIN table_b t2_stats ON t2_stats.t2_aff_id = table_a.id'). 
select("table_a.*, 
sum(t1_stats.amount1) AS 1_sum1, 
sum(t2_stats.amount1) AS 2_sum1, 
sum(t1_stats.amount2) AS 1_sum2, 
sum(t2_stats.amount2) AS 2_sum2"). 
group('table_a.id') 

合計の合計で正しい結果が得られません。 table_a_id_1 = table_a.idのtable_bのレコードの1_sum1のレコードを集計するだけで済むので、代わりにすべてのレコードが含まれている可能性があると思います。

代わりにサブ選択する必要がありますか?これは私のここでの強みではないので、このクエリを整理するための助けとなるのは素晴らしいことです!

おかげ

答えて

0

試してみてください。

results = TableA. 
select("table_a.*, 
(SELECT sum(table_b.amount1) FROM table_b WHERE table_b.t1_aff_id = table_a.id) AS 1_sum1, 
(SELECT sum(table_b.amount2) FROM table_b WHERE table_b.t1_aff_id = table_a.id) AS 1_sum2, 
(SELECT sum(table_b.amount1) FROM table_b WHERE table_b.t2_aff_id = table_a.id) AS 2_sum1, 
(SELECT sum(table_b.amount2) FROM table_b WHERE table_b.t2_aff_id = table_a.id) AS 2_sum2") 
+0

これは動作しますが、感謝します。これがまだ効率的かどうか、テーブルbに何十万行も入ると私は興味があります。私は実際にはテーブルbから合計している合計8列を持っているので、私はその場合8サブクエリを行うと思います。それが問題になるかどうかはわかりません。これを試してみる必要があります。助けてくれてありがとう。 – Sean

+0

心配はいりません。私はそれがどのように多くの行で実行されるのか分からない - しかし、私はあなたがその時点に達してからクエリを最適化するまで待つだろう。あなたがその答えが役に立つと分かった場合は、upv​​otingまたは正しいものとしてマークすることを検討してください。 –

関連する問題