1

この質問がまだ尋ねられているかどうかはわかりませんが、より良い言葉で表現する方法がわかりません:)

ゲーム結果の表があります。(リーダーボードの場合) 上位 10 の結果を返す必要がありますが、結果はプレーヤーごとに最高のゲームを返す必要があり、プレーヤーを複製する必要はありません (したがって、各プレーヤーの最高スコアを探しており、それに基づいて上位 10 人のプレーヤーは言うまでもありません)スコアで 1 位と 3 位の場合は 2 回表示します)。

現在使用しているSQLは次のとおりです。

 SELECT 
        `games`.`score`,
        CONCAT(`users`.`full_name`) AS `name`,
        `users`.`facebook_id`
        FROM 
        `games`,
        `users` 
        WHERE 
        `games`.`user_id`=`users`.`id` 
        AND `users`.`id` IN ('user ids goes here') 
        AND `games`.`status`=2
        ORDER BY 
        `games`.`score` DESC 
        LIMIT 10";

これは単一のクエリで実行できますか、または返された配列で作業し、そこから目的の結果を作成するのが最善でしょうか?

アップデート:

分かりやすく説明すると、次のような結果が得られたとします。

Jack - 300 points
Jill - 280 points
Gareth - 250 points
Jack - 240 points (this is the same jack)
Peter - 230 points 
....

すべてのゲームから、最高スコアに基づいて上位 10 人のプレーヤーを返したいので、必ずしも 10 の結果ではありませんが、次の結果を返す結果を探しています。

Jack - 300 points
Jill - 280 points
Gareth - 250 points
Peter - 230 points 

したがって、2 番目のジャックは、スコアが高いだけで既にリストに含まれているため、削除されます。

これが役立つことを願っています:)

4

2 に答える 2

0

必要なのは次のクエリだと思います。

SELECT 
    MAX(`games`.`score`),
    CONCAT(`users`.`full_name`) AS `name`,
    `users`.`facebook_id`
FROM 
    `games`
JOIN `users` 
    ON `games`.`user_id` = `users`.`id` 
WHERE `users`.`id` IN ('user ids goes here') 
    AND `games`.`status`=2
GROUP BY `name`
ORDER BY `games`.`score` DESC 
LIMIT 10";

シンプルを使用するだけMAX(games.score)で、結果をグループ化するだけでうまくいきます。

于 2013-09-13T15:48:03.737 に答える
0

Okay, let's do this step by step.

With this query, we get a list of games and their players, sorted by game and score. We add a rownumber which resets to 1 for each game.

SELECT 
games.game_id,
`games`.`score`,
CONCAT(`users`.`full_name`) AS `name`,
`users`.`facebook_id`,
@row_num := if(@game != games.game_id, 1, @row_num + 1) AS rownumber,
@game := games.game_id
FROM 
`games`
INNER JOIN users ON `games`.`user_id`=`users`.`id` 
, (select @row_num := 1, @game := NULL) variables
WHERE 
`users`.`id` IN ('user ids goes here') 
AND `games`.`status`=2
ORDER BY 
games.game_id, /*or something*/
`games`.`score` DESC 

Now we can get the top 10 players for each game by putting above query into this

SELECT * FROM (
<above query here>
) subquery_alias
WHERE rownumber <= 10;

Now we just have to add a GROUP BY playername and get the greatest result. So your final query is this:

SELECT name, MAX(score) FROM (
SELECT 
games.game_id,
`games`.`score`,
CONCAT(`users`.`full_name`) AS `name`,
`users`.`facebook_id`,
@row_num := if(@game != games.game_id, 1, @row_num + 1) AS rownumber,
@game := games.game_id
FROM 
`games`
INNER JOIN users ON `games`.`user_id`=`users`.`id` 
, (select @row_num := 1, @game := NULL) variables
WHERE 
`users`.`id` IN ('user ids goes here') 
AND `games`.`status`=2
ORDER BY 
games.game_id, /*or something*/
`games`.`score` DESC 
) subquery_alias
WHERE rownumber <= 10
GROUP BY `name`
于 2013-09-13T15:54:45.433 に答える