Heroku で実行している Rails アプリがあり、ハイスコア リストに対するユーザーのランク (位置) を計算しようとしています。
このアプリは、ユーザーが互いに賭けを行う場所であり、賭けを開始する (CHOICE を作成する) か、既に作成された Choice に対して (BET を行うことによって) 賭けることができます。
次の SQL を使用すると、Choices と Bets の両方での合計賞金に基づいてユーザーの配列が得られます。しかし、間違った合計賞金が得られます。SQL をChoice テーブルまたは Bet テーブルのみが含まれている場合、問題なく動作します。
正しく動作するように SQL を書き直す方法についての指針を持っている人:)
SELECT users.id, sum(COALESCE(bets.profitloss, 0) + COALESCE(choices.profitloss, 0)) as total_pl
FROM users
LEFT JOIN bets ON bets.user_id = users.id
LEFT JOIN choices ON choices.user_id = users.id
GROUP BY users.id
ORDER BY total_pl DESC
結果:
+---------------+
| id | total_pl |
+---------------+
| 1 | 830 |
| 4 | 200 |
| 3 | 130 |
| 7 | -220 |
| 5 | -1360 |
| 6 | -4950 |
+---------------+
以下は、1 つのテーブルにのみ結合する 2 つの SQL 文字列と、そこからの 2 つの結果です。以下の合計が上記の結果と一致しないことを確認してください。以下は正しい合計です。
SELECT users.id, sum(COALESCE(bets.profitloss, 0)) as total_pl
FROM users
LEFT JOIN bets ON bets.user_id = users.id
GROUP BY users.id
ORDER BY total_pl DESC
SELECT users.id, sum(COALESCE(choices.profitloss, 0)) as total_pl
FROM users
LEFT JOIN choices ON choices.user_id = users.id
GROUP BY users.id
ORDER BY total_pl DESC
+---------------+
| id | total_pl |
+---------------+
| 3 | 170 |
| 1 | 150 |
| 4 | 100 |
| 5 | 80 |
| 7 | 20 |
| 6 | -30 |
+---------------+
+---------------+
| id | total_pl |
+---------------+
| 1 | 20 |
| 4 | 0 |
| 3 | -10 |
| 7 | -30 |
| 5 | -110 |
| 6 | -360 |
+---------------+