2011-03-12 64 views
2

我想获得最后5行的列的平均值(如果玩家少于5行(游戏),那么它应该返回什么都没有..)表中每个组的底N行的平均值

如果我可以使用子查询,那么它会直截了当,但由于这不支持我不知道如何处理它。

下面的sql是我到目前为止,如果玩家玩过超过5场比赛,这将使我获得每个玩家所有游戏的平均值。

CREATE VIEW last_5_avg 
AS 
    SELECT player, avg(score) FROM game_stats 
JOIN games 
ON games.id = games_stats.id GROUP BY player HAVING COUNT(games.id) > 4 
ORDER BY games.id DESC; 

貌似解决此问题的唯一方法是创建一个视图为每个玩家的最后5个game_stats,然后使用第二个观点做的平均值。

+0

你用什么引擎? – 2011-03-12 18:59:29

+0

@Transact Charlie:MyISAM – volting 2011-03-12 19:10:42

回答

0

使用LIMIT。

XXXXXXX ORDER BY games.id DESC LIMIT 5; 

确保你有你的条件,按以下顺序 -

HAVING ---> ORDER BY ---> LIMIT 

参考http://dev.mysql.com/doc/refman/5.1/en/select.html

+0

我已经试过了LIMIT,但它没有起作用,据我所见,它只是限制放入视图的行数而不是平均的行数。 – volting 2011-03-12 19:01:10

1
select player, avg(score) 
from game_stats 
inner join games g0 on g0.id = games_stats.id 
where g0.id in (
    select g1.id 
    from games g1 
    where g1.id = g0.id 
    order by g1.id desc 
    limit 5 
    ) 
group by player 
having count(g0.id) > 4 
order by g0.id desc; 
+0

我欣赏尝试,但这不会工作的原因有很多,1)subquerys不支持在视图中,2)LIMIT不支持subquerys 3)子查询只选择底部5行,我需要选择表中每个组的底部5,就像这个http://stackoverflow.com/questions/3998529/selecting-top-n-rows-for-each-group-in-a-table。 – volting 2011-03-13 11:29:31