PDO 返回最高整数值且没有重复条目
Posted
技术标签:
【中文标题】PDO 返回最高整数值且没有重复条目【英文标题】:PDO Return highest integer value and no duplicate entries 【发布时间】:2013-09-18 08:19:12 【问题描述】:我不确定是否有人问过这个问题,但我不知道如何更好地表达它:)
我有一张包含游戏结果的表格。我需要返回前 10 名结果(对于排行榜),但我的结果必须返回每个玩家的最高游戏而不是复制玩家(所以我正在寻找每个玩家的最高分并基于前 10 名玩家,而不是说如果我的分数是第 1 和第 3 则显示两次)。
我现在使用的 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
所以第二个杰克被删除了,因为他已经在名单上,只是分数更高。
我希望这会有所帮助:)
【问题讨论】:
我不明白你的问题;你有数据和预期输出的小例子吗?GROUP BY users.id
和 MAX(games.score)
的东西?可能取决于您的数据库服务器。
... 实际上 - ^ 这不起作用,因为它仅返回最好的分数,而不是前 10 名。可能需要一个子查询,但是有效地充当另一个数据库查询,因此,除非您要构建存储过程,否则仅从数据库中获取结果并在应用程序中对其进行排序的开销可能会更少。
@ExplosionPills 我添加了一些附加信息以最好地说明我在寻找什么
Get top n records for each group of grouped results的可能重复
【参考方案1】:
好的,让我们一步一步来。
通过这个查询,我们可以得到一个按游戏和得分排序的游戏及其玩家列表。我们添加一个行号,每场比赛都重置为 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`
【讨论】:
【参考方案2】:我认为您需要的是以下查询:
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)
即可将结果组合在一起。
【讨论】:
以上是关于PDO 返回最高整数值且没有重复条目的主要内容,如果未能解决你的问题,请参考以下文章
什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?来源