1

こんにちは、次のクエリがあります。

Player.select("Players.*, (SELECT COUNT(*) FROM Results WHERE Results.player_id = Players.id and win = true and competition_id = 4) as wins").where("competition_id = 4").order("wins desc")

基本的には、特定の大会で win が true に設定されている結果テーブル内の外部キーの出現に基づいて、Player レコードをカウントおよび順序付けします。リザルト テーブルのサンプル データは次のようになります。

Player_ID | Match_ID|Win|Elapsed_Time|etc..
1         |    1    |T  | 1:00       |etc..
2         |    1    |F  | 1:00       |etc..
1         |    2    |T  | 3:00       |etc..
3         |    2    |F  | 3:00       |etc..

ご覧のとおり、このステートメント内で 2 つの Select が発生しているため、将来的にパフォーマンスが低下する可能性があると考えています。ご想像のとおり、プレイヤーは実際にはリザルトと 1 対多の関係にありますが、より効率的であると思われる結合でこれを機能させる方法がわかりませんでした。

おそらく私は間違っており、上記のクエリに問題はありません。どちらの場合でも、アドバイスを提供してください。

PostgreSQL データベースを使用しています。

4

1 に答える 1

0

たぶん、このようなものですか?

Player.joins(:results).where("results.win = true AND results.competition_id = 4").order("results.count DESC")
于 2012-06-16T15:35:09.023 に答える