は提出:SQLネストされた要求
transaction
- ユーザーのバランス変更に関する一般的な情報。primary key : transaction_id
。bet_transactions
- ベットに関する特別な情報、foreign key : transaction_id
。win_transaction
-bet_transactions
と同じですが、wins
を含みます。
すべての賭けと勝利の合計を取得します。 私はこの思い付いた:
はselect
u.username as username,
u.balance as balance,
sum(bt.amount) as bet_sum,
sum(wt.amount) as win_sum
from
users u,
(
select
t.*
from
transactions t,
bet_transactions b
where
t.transaction_id = b.transaction_id
) bt,
(
select
t.*
from
transactions t,
win_transactions w
where
t.transaction_id = w.transaction_id
) wt
where
u.username = bt.username and
u.username = wt.username
group by
u.username
それが正常に動作しない:私は常に一列のみを取得し、合計が正しくありません。 しかし、このようなネストされた部分の1つを削除すると、期待どおりに機能し始めます。私は間違って何をしていますか?
select
u.username as username,
u.balance as balance,
sum(bt.amount) as bet_sum
from
users u,
(
select
t.*
from
transactions t,
bet_transactions b
where
t.transaction_id = b.transaction_id
) bt
where
u.username = bt.username
group by
u.username
これは、1980年代に使用した結合構文です。それは1992年に冗長化されました。もう使用しないでください。代わりに適切なANSI結合を使用して、エラーの発生が少なく、読み込みと保守が容易になります( 'トランザクションからt_transaction_id = b.transaction_id'にbet_transactions bに参加する)。 –
金額(賭け金または勝利金額)はテーブル「取引」にありますか?これは、トランザクションが賭けか勝利か、あるいはその両方であるかを知るために 'bet_transactions'と' win_transactions'だけを調べることを意味します。 –