我不确定此问题是否已被提出,但我不知道如何更好地说出来:)
我有一张包含游戏结果的表格。我需要返回前十名的结果(对于排行榜),但我的结果必须返回每位玩家的最高游戏而不是复制玩家(因此我寻找每位玩家的最高分并且基于前十名玩家,而不是说如果我分数第一和第三,给我看两次。
我目前使用的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个结果,但我正在寻找一个结果,然后返回以下内容:
Jack - 300 points
Jill - 280 points
Gareth - 250 points
Peter - 230 points
所以第二个杰克被删除了,因为他已经在榜单上得分更高了。
我希望这会有所帮助:)
答案 0 :(得分: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)
即可将结果分组在一起。
答案 1 :(得分:0)
好的,我们一步一步来做。
通过此查询,我们可以获得游戏及其玩家的列表,按游戏和分数排序。我们添加一个rownumber,每个游戏重置为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玩家名称并获得最佳结果。所以你的最终查询是这样的:
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`