1

我不确定这个问题是否已经被问过,但我不知道如何更好地表达它:)

我有一张游戏结果表。我需要返回前 10 名结果(对于排行榜),但我的结果必须返回每个玩家的最高游戏而不是复制玩家(所以我正在寻找每个玩家的最高分并基于前 10 名玩家,而不是说如果我在分数上排名第一和第三,请向我展示两次)。

我现在使用的 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 

所以第二个杰克被删除了,因为他已经在名单上,只是分数更高。

我希望这有帮助 :)

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

好的,让我们一步一步来。

通过这个查询,我们得到一个游戏列表和他们的玩家,按游戏和得分排序。我们添加一个行号,每场比赛重置为 1。

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 

现在我们可以通过将上面的查询放入其中来获得每场比赛的前 10 名球员

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

现在我们只需要添加一个 GROUP BY playername 并获得最好的结果。所以你的最终查询是这样的:

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 回答