MySQL总和每组最后X行

时间:2014-08-24 05:23:47

标签: mysql group-by limit greatest-n-per-group correlated-subquery

我有以下表格:

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个查询代表了每个玩家的预期结果。我只需知道如何在同一个查询中获取所有这些结果。)

1 个答案:

答案 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对于按玩家排序结果很重要如果您需要玩家姓名然后在父查询中加入玩家

,则以递减方式记录其记录