我有一個應用程序,用於存儲每個錦標賽的玩家評分。所以我有很多-to-many關聯:SQL:從查詢中獲取選定的行索引
Tournament
has_many :participations, :order => 'rating desc'
has_many :players, :through => :participations
Participation
belongs_to :tournament
belongs_to :player
Player
has_many :participations
has_many :tournaments, :through => :participations
的參與模式有一個rating
場(浮動)存儲的評價值(它像得分點),每個玩家在每場比賽。
我想要的東西 - 獲得玩家的最後10個等級(rank
是基於他的等級的特定比賽中的玩家的位置:更多等級 - 更高等級)。對於現在獲得比賽我加載了本次比賽的所有參股玩家的排名,由rating
場對它們進行排序,並與Ruby代碼得到了玩家的參與指數:
class Participation < ActiveRecord::Base
belongs_to :player
belongs_to :tournament
def rank
tournament.participations.index(self)
end
end
方法參與的rank
獲得其父比賽中,加載所有tournamentr的參股(由rating desc
訂購),並獲得自己的索引這個集合裏面
,然後是這樣的:
player.participations.last.rank
的有一件事我不喜歡 - 它需要加載所有參加比賽的比賽,並且如果我需要最後10場比賽的球員排名,它會加載超過5000個項目(當新球員加入時它的數量會增加)。
我相信應該有辦法爲它使用SQL。其實我試圖使用SQL變量:
find_by_sql("select @row:[email protected]+1 `rank`, p.* from participations p, (SELECT @row:=0) r where(p.tournament_id = #{tournament_id}) order by rating desc limit 10;")
此查詢從給定的錦標賽中選擇前10的評級。我一直試圖修改它以選擇給定用戶和他的等級的最後10個參與者。
將不勝感激任何形式的幫助。 (我認爲解決方案將是一個SQL請求,因爲它對ActiveRecord來說非常複雜)。
P.S.我使用rails3.0.0.beta4
UPD:
這裏是最終的SQL請求得到球員的最後10個等級(除了它加載參加比賽也一樣)
SELECT *, (
SELECT COUNT(*) FROM participations AS p2
WHERE p2.tour_id = p1.tour_id AND p2.rating > p1.rating
) AS rank
FROM participations AS p1 LEFT JOIN tours ON tours.id = p1.tour_id WHERE p1.player_id = 68 ORDER BY tours.date desc LIMIT 10;
謝謝,這對我有用:) – 2013-07-25 06:42:11