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位です。

しかし、問題は、ユーザーが何も選択しなかった場合、結果にそのユーザーが含まれないことです。

それで、コードを修正する方法、それで、どちらかの選択の賭けがゼロであるとしても、それは利益の損失に合計されます。

解決:

ええと..それを機能させるために私はあなたの2つの答えを組み合わせる必要があったようです:)

LEFT JOIN私はwithが必要だった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)

どうもありがとうございました..私はこれを解決するために一日中努力してきました..

問題は、誰が答えを得るのかということです。それは2つの組み合わせですか。

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 に答える