我有一个在 Heroku 运行的 Rails 应用程序,我正在尝试计算用户在高分列表中的排名(位置)。
该应用程序是用户相互下注的地方,可以开始下注(创建一个选择),或者他们可以对一个已经创建的选择下注(通过下注)。
我有以下SQL,它应该根据他们在Choices 和Bets 上的总奖金给我一个用户数组。但它给了我一些错误的总奖金,我认为问题出在Left Joins 因为如果我将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 |
+---------------+
下面是我只连接到一个表的两个 SQL 字符串以及来自该表的两个结果.. 看到下面的总和与上面的结果不匹配.. 下面是正确的总和。
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 |
+---------------+