我有以下表格:
player_records
int id (pk)
int player_id (fk)
int round_id (fk)
int kills
玩家
int id (pk)
varchar name
轮
int id (pk)
int duration // round duration in seconds
我需要为他们参加过的最后10轮比赛中的每位球员选择杀/小时(SUM(杀戮)/ SUM(持续时间/ 60/60))比率每个球员参加一轮比赛。
我发现的所有类似问题都指向this article,但由于我必须在分组前将记录限制为10,因此我无法将其技巧应用于上述需求。
为了进一步说明,如果我只需要一个玩家,这就是我要做的事情:
SELECT SUM(t1.kills)/SUM(t1.duration)*60*60 kills_hour_last_10
FROM (
SELECT records.kills, rounds.duration
FROM records
JOIN rounds ON rounds.id = records.round_id
WHERE records.player_id = 1
ORDER BY records.id DESC
LIMIT 10
) t1;
更新了fiddle(这3个查询代表了每个玩家的预期结果。我只需知道如何在同一个查询中获取所有这些结果。)
答案 0 :(得分:2)
你可以使用排名查询mysql没有这种类型结果的窗口函数来获得每组n条记录
SELECT t.player_id,
SUM(t.kills)/SUM(t.duration)*60*60 kills_hour_last_10
FROM (
SELECT *,
@r:= CASE WHEN @g = player_id THEN @r + 1 ELSE 1 END rownum,
@g:= player_id
FROM (
SELECT r.player_id,r.id,r.kills, rs.duration
FROM records r
JOIN rounds rs ON rs.id = r.round_id
ORDER BY r.player_id ASC,r.id DESC
) t1
CROSS JOIN (SELECT @g:=NULL,@r:=NULL) t2
) t
WHERE rownum <= 10
GROUP BY t.player_id
Fiddle Demo
以上查询将为属于同一player_id组的记录提供排名,在父查询中,您可以将每个player_id的记录限制为10,并执行您的聚合逻辑记录ORDER BY r.player_id,r.id DESC
对于按玩家排序结果很重要如果您需要玩家姓名然后在父查询中加入玩家