次の 4 つのテーブルがあるとします。
CREATE TABLE events ( id, name )
CREATE TABLE profiles ( id, event_id )
CREATE TABLE donations ( amount, profile_id )
CREATE TABLE event_members( id, event_id, user_id )
すべてのイベントのリスト、メンバーの数、および寄付の合計を取得しようとしています。問題は、寄付の合計が間違って戻ってくることです (寄付のデカルト結果 * event_members の数のように見えます)。
これがSQLクエリです(Postgres)
SELECT events.name, COUNT(DISTINCT event_members.id), SUM(donations.amount)
FROM events
LEFT OUTER JOIN profiles ON events.id = profiles.event_id
LEFT OUTER JOIN donations ON donations.profile_id = profiles.id
LEFT OUTER JOIN event_members ON event_members.event_id = events.id
GROUP BY events.name
sum(donations.amount) が返ってきます = 実際の寄付の合計 * event_members の行数。count(distinct event_members.id) をコメントアウトし、event_members が外部結合を残した場合、合計は正しいです。
編集: アーウィンは私を正しい方向に向けました。クエリは次のように書き直されました。
SELECT events.name, COUNT(DISTINCT event_members.id), select(SUM(donations.amount) from donations,profiles where donons.profile_id = profiles.id and profiles.event_id = events.id) as total_donations FROM イベント LEFT OUTER JOIN event_members ON event_members.event_id = events.id GROUP BY events.name