2017-07-16 173 views
0

我有一個名爲Game的表格,它在nhl季節中充滿了來自所有遊戲的單個玩家statlines。我在這裏關注的領域是本賽季球員第n場比賽的games_played。 和名字是玩家的名字。如何獲得軌道查詢中每個組的最後第n條記錄

本質上我想弄清楚如何抓住每個球員的第nth最後一場比賽。

例如我知道下面的查詢可以得到我的最後一場比賽對每個球員

Game.group(:name).having('games_played = MAX(games_played)') 

然而,當我嘗試以下方法(可以說,n爲10)

Game.group(:name).having('games_played=MAX(games_played)-10') 

我沒有得到任何結果

而且事實上如果我明確地做了類似於

Game.group(:name).having('games_played=16') 

我只得到玩過16場比賽的球員的最後一場比賽,而不是所有球員的第16場比賽。 (我猜這解釋了以前的查詢沒有結果)

我該如何去獲得每個玩家的最後一場比賽?

這是甚至正確的方式來查詢此?我也有一個玩家表,玩家擁有多個遊戲,一個遊戲屬於一個玩家。我應該利用這一點嗎?

+0

你能解釋一下**第n個最後一個**嗎? – Pavan

+0

你有沒有考慮過'take'功能?例如。將'.take(n).last'添加到查詢的末尾? –

+0

@Pavan,最後一位我指的是在最近一場比賽之前的n-1場比賽。所以倒數第二次是最近的第二場比賽,倒數第10次是最近的第10場比賽。我想爲每個不同的玩家獲得該遊戲。 – user3692508

回答

1

要找到特定玩家的第n個最後一場比賽,最簡單的方法是找到玩家。

player = Player.find_by(name: "user3692508") 

,那麼你可以找到與玩家遊戲:通過games_played

player.games 

要獲得的第n個最後一場比賽,你可以責令其按降序排列,然後將其限制在一個結果,並抵消它你想要的偏移量:

player.games.order(games_played: :desc).limit(1).offset(0) 

如果你做了一個0的偏移量,你會得到最後一場比賽。如果你的偏移量爲1,你將獲得最後一場比賽,等等。

這是假設您的播放器has_many :games和遊戲belongs_to :player

通過使用子查詢,你可以得到每個球員的第n個最後一場比賽。(它看起來像一個爛攤子.....)

offset = 1 

sub_query = "SELECT 'sub_game'.id FROM 'games' as sub_game WHERE 'sub_game'.'player_id' = games.player_id ORDER BY 'sub_game'.'games_played' DESC LIMIT 1 OFFSET #{offset}" 

Game.joins(:player).where("games.id IN (#{sub_query})").order(id: :desc).group(:player_id) 

使用此解決方案,您可以爲子查詢中的每個玩家排序遊戲,並首先在那裏進行偏移。

+0

謝謝,這非常有幫助。 是否有可能有一個查詢返回每個玩家的最後一場比賽,還是應該爲每個玩家設置一個查詢? – user3692508

+0

要獲得每個玩家的最後一場比賽,您可以執行'Game.joins(:player).order(games_played :: desc).group(:player_id)',但不知道如何爲其添加偏移量。 –

+0

我爲我的答案添加了一個解決方案,它將爲您提供每位玩家的最後一場比賽 –

相關問題