2017-03-12 6 views
0

を2つの選択し、テーブルと合計欄の値

-----table------columns----- 

1. tbl_users - `userID` 
2. matches - `id` (there are other columns I use for the clauses) 
3. preds  - `uid` (same as `userID`) 
       `mid` (same as `matches.id`) 
       `reward` (this is the column I need to sum up) 
4. exact  - same structure as `preds` 

ここで何私が考えてきた:

SELECT ( 
     select sum(preds.reward) FROM preds, matches, tbl_users WHERE ...some clauses...    
) a, 
( 
     select sum(exact.reward) FROM exact, matches, tbl_users WHERE ...some clauses...  
) b, 
     ...here I need to sum(a+b) as total..., 
     tbl_users.userID 
FROM 
     tbl_users 
GROUP BY userID 
ORDER BY total DESC LIMIT 5 
+0

質問がありますか?私は 'FROM'節でカンマを決して使用しないことをお勧めします。 –

答えて

1

すべきではない、私はこのクエリへのより一般的なアプローチが可能だと思う:

SELECT u.uid, 
     ((select sum(p.reward) 
     from preds p 
     where p.uid = u.uid 
     ) + 
     (select sum(e.reward) 
     from exact e 
     where e.uid = u.uid 
     ) 
     ) total 
from tbl_users u join 
    matches m 
    on . . . 
where . . . 
order by total desc 
limit 5; 

これにより、クエリの複雑さが制限されます。 where句の性質によっては、相関サブクエリを使用することで大きなパフォーマンスが得られます。

注:ユーザーが一方または両方の表から欠落している可能性がある場合は、サブクエリがNULLを返す可能性があることを考慮する必要があります。

+0

私はあなたのコードを微調整し、私が望む結果を得ました。また、最後にuserIDでグループ化しなければなりませんでした。ありがとう。 – user1542894

1
あなたが本当に必要な場合はまあ、代わりにそれらを結合するそれらのサブクエリ、あなたの唯一の解決策は、別のサブクエリであるように思わ

SELECT combined.a, combined.b, combined.a + combined.b as sum, combined.userID 
FROM (
    SELECT ( 
      select sum(preds.reward) FROM preds, matches, tbl_users WHERE ...some clauses...    
    ) a, 
    ( 
      select sum(exact.reward) FROM exact, matches, tbl_users WHERE ...some clauses...  
    ) b, 
      tbl_users.userID userID 
    FROM 
     tbl_users 
    GROUP BY userID 
    ORDER BY total DESC LIMIT 5 
) as combined 

あなたは5に、内部クエリによって返されるレコードの量を制限した後、これは劇的なパフォーマンスへの影響

+0

私はそれらを実際に必要としません、私は合計が必要です。どのように私はそれらに参加するつもりですか? – user1542894

+0

テーブルのレイアウトによって異なります。しかし、あなたが集約するだけであれば、私の解決策はうまくいくはずです – Psi

関連する問題