1

在阅读了其他几个类似问题的答案后,我仍然无法实现以下目标:

有一个球员分数列表,我想得到每个球员的前n分(分数表只有球员 id 和一个值)。最终目的是用AVG()函数聚合分数。

另请注意,n界限只是一个限制;一个玩家的分数可能少于n 个,在这种情况下,应该计算所有分数。

一旦计算出结果,加入玩家表将允许将每个玩家 id 扩展为可打印的信息。

4

3 回答 3

2

在 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

在 sqlfiddle 测试它

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 |
于 2012-08-13T20:12:34.757 回答
1

从这里开始:

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;

这将为您提供所需的最高分列表。

于 2012-08-13T20:18:35.270 回答
0

我不是 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
于 2012-08-13T19:26:13.223 回答