我有以下代码行:
@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 JOIN
和COALESCE
,所以我得到了以下代码,这些代码可以工作..
@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)
非常感谢..我已经使用了所有的日常工作来解决这个问题。
问题是谁得到答案现在它是两者的组合?
答案 0 :(得分:1)
我不得不使用这一天类似的东西,看看COALESCE(某事,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)
答案 1 :(得分:1)
我自己并不使用Ruby,但是对于没有做过任何“下注”的用户,你说你“缺少”行。这听起来像您的实际查询生成INNER JOIN
而您需要LEFT JOIN
。看看this SO answer helps。