0

機能しない次のクエリがあり、それを修正する方法を考えていました。

Player.select("players.*, 
    (SELECT COUNT(*) FROM Results 
    WHERE results.player_id = players.id and win = true) 
as wins").where("wins > 0").order("wins desc")

ブール値が true に設定されている場合に、結果テーブルに外部キーが表示される回数をカウントして、親の Player レコードを制限しようとしていwinます。ただし、結果テーブルに外部キーが表示されることがありますが、ブールwinフィールドが false になり、表示したくないレコードのカウントがゼロになることがあります。 .where("wins > 0") 句ですが、次のエラーが発生します。

PGError: エラー: 列 "wins" が存在しません

面白いのはwins、私が試して注文するとフィールドが見つかりますが、where 句が追加されていないことです。

4

1 に答える 1

1

次のクエリが機能すると思います。

select players.*, count(results.id) as wins from players left join results on results.player_id = players.id and results.win = true group by players.id having count(results.id) > 0 order by wins desc;

これはRailsifyであるはずですが、当然私はテストしていません。

Player.select('players.*, count(results.id) as wins').joins('left join results on results.player_id = players.id and results.win = true').group('players.id').having('count(results.id) > 0').order('wins desc')

wins = 0の行を気にしない場合は、左結合の代わりに内部結合を実行できます。これは、より高速な場合があります。

于 2012-06-19T18:08:05.840 に答える