在阅读了其他几个类似问题的答案后,我仍然无法实现以下目标:
有一个球员分数列表,我想得到每个球员的前n分(分数表只有球员 id 和一个值)。最终目的是用AVG()
函数聚合分数。
另请注意,n界限只是一个限制;一个玩家的分数可能少于n 个,在这种情况下,应该计算所有分数。
一旦计算出结果,加入玩家表将允许将每个玩家 id 扩展为可打印的信息。
在阅读了其他几个类似问题的答案后,我仍然无法实现以下目标:
有一个球员分数列表,我想得到每个球员的前n分(分数表只有球员 id 和一个值)。最终目的是用AVG()
函数聚合分数。
另请注意,n界限只是一个限制;一个玩家的分数可能少于n 个,在这种情况下,应该计算所有分数。
一旦计算出结果,加入玩家表将允许将每个玩家 id 扩展为可打印的信息。
在 MySQL 中,您需要 vars 来满足您的要求:
select
idplayer, Score
from
(
select
idplayer, T.Score,
@r := IF(@g=idplayer,@r+1,1) RowNum,
@g := idplayer
from (select @g:=null) initvars
CROSS JOIN
(
SELECT s.Score,
s.idplayer
FROM scores s
ORDER BY idplayer, s.score DESC
) T
) U
WHERE RowNum <= 3
create table scores( idplayer int, score int);
insert into scores values
(1,5), (1,7), (1,18), (1,27), (2,6);
结果:
| IDPLAYER | SCORE |
--------------------
| 1 | 27 |
| 1 | 18 |
| 1 | 7 |
| 2 | 6 |
从这里开始:
drop table if exists scores;
create table scores (playerid integer, score integer);
insert into scores values
(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),
(2,1),(2,2),(2,3),(2,4);
select p1.playerid, p1.score
from scores p1, scores p2
where p1.playerid = p2.playerid
and
p1.score >=
ifnull((select score
from scores
where playerid=p1.playerid
order by score desc limit 4,1
),0)
group by p1.playerid,p1.score;
这将为您提供所需的最高分列表。
我不是 100% 确定这将在 mysql 中工作。但是,以下将这个想法捕获为相关子查询:
select p.*,
(select sum(score)
from (select score
from scores s
where s.playerid = p.playerid
order by score desc
limit 5
) s2
) as summax5
from players p