gpt4 book ai didi

ruby-on-rails - 如何在 Rails 查询中获取每个组的最后第 n 条记录

转载 作者:行者123 更新时间:2023-12-04 16:09:37 25 4
gpt4 key购买 nike

我有一个名为 Game 的表,其中包含一个 nhl 赛季中所有比赛的个人球员统计数据。我在这里关注的字段是 games_played ,它 = n 代表本赛季球员的第 n 场比赛。和名字,这是玩家的名字。

本质上,我想弄清楚如何为每个玩家抓取第 n 个最后一场比赛。

例如,我知道以下查询可以获得每个玩家的最后一场比赛

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 场比赛。 (我想这解释了之前查询的 no 结果)

我如何为每个玩家获取第 n 个最后一场比赛?

这是否是正确的查询方式?我还有一个玩家表,其中一个玩家有很多游戏,一个游戏属于一个玩家。我应该利用它吗?

最佳答案

要查找特定玩家的第 n 场比赛,从查找玩家开始可能是最简单的。

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

然后你可以找到玩家游戏:

player.games

要获得第n场比赛,你可以按games_played降序排列,然后限制为一个结果并用你想要的偏移量进行偏移:

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)

使用此解决方案,您可以在子查询中对每个玩家的游戏进行排序,并首先在那里进行偏移。

关于ruby-on-rails - 如何在 Rails 查询中获取每个组的最后第 n 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45126882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com