1

同様の問題に関する他のいくつかの回答を読んだ後でも、次のことを達成するために頭を包むことができません。

プレーヤーのスコアのリストを持っているので、各プレーヤーの上位n個のスコアを取得したいと思います(スコアテーブルにはプレーヤーIDと値のみが含まれます)。最終的な目的は、AVG()関数を使用してスコアを集計することです。

また、 n境界は単なる制限であることに注意してください。プレーヤーのスコアがn未満の場合、すべてのスコアを計算する必要があります。

結果が計算されたら、プレーヤーテーブルに参加すると、各プレーヤーIDを印刷可能な情報に拡張できます。

4

3 に答える 3

2

MySQLでは、要件を満たすために変数が必要です。

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

これがmysqlで機能するかどうかは100%わかりません。ただし、以下は、相関サブクエリとしてアイデアをキャプチャします。

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 に答える