0

我有以下代码行:

@ranking_array  = User.joins(:bets, :choices).select("users.id, sum(bets.profitloss + choices.profitloss) as total_pl").group("users.id").order("total_pl DESC").map(&:id)

这给了我一个用户排名的数组——比如用户 X 排在第 25 位,依此类推。

但问题是,如果用户没有对任何选择下注,结果将不包括该用户。

那么如何修复代码,即使选择的任何一个赌注都是零,它也会总结利润损失。

解决方案:

好吧..看来我必须结合你的两个答案才能使它起作用:)

我需要LEFT JOINwithCOALESCE所以我得到了以下似乎有效的代码..

@ranking_array  = User.find(:all,
                  :joins =>  "LEFT JOIN `bets` ON bets.user_id = users.id LEFT JOIN `choices`ON choices.user_id = users.id",
                  :select => "users.id, sum(COALESCE(bets.profitloss, 0) + COALESCE(choices.profitloss, 0)) as total_pl",
                  :group =>  "users.id",
                  :order =>  "total_pl DESC").map(&:id)

非常感谢..我已经用了一整天的时间来解决这个问题..

问题是现在谁得到答案是两者的结合?

4

2 回答 2

1

有一天我也不得不使用这个,比如查看 COALESCE(something, 0) ,它将返回一个或另一个。地狱,我认为您可以在 0 之前添加更多选项,因为它将一直持续到 0。

@ranking_array  = User.joins(:bets, :choices).select("users.id, sum(COALESCE(bets.profitloss, 0) + COALESCE(choices.profitloss, 0)) as total_pl").group("users.id").order("total_pl DESC").map(&:id)
于 2012-11-10T14:46:44.380 回答
1

我自己不使用 Ruby,但您说您为没有进行任何“下注”的用户“缺少”行。听起来您的实际查询正在生成一个INNER JOIN并且您需要一个LEFT JOIN. 看看这个 SO 答案是否有帮助

于 2012-11-10T17:09:15.273 回答