编辑:由 Ian 和 Mark 解决...
需要从 MySQL 数据库(使用 php)获取游戏的高分。 我使用的查询对于总是随时间增加的统计数据效果很好。 然而,该查询不适用于可以及时上升或下降的统计数据。
一些细节:
玩家的统计数据存储在stats
表中。每个玩家多行(所有更新),auto_increment 列是主键。
CREATE TABLE IF NOT EXISTS `stats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stamp` bigint(20) NOT NULL,
`username` varchar(255) NOT NULL,
`kill` int(11) NOT NULL,
`death` int(11) NOT NULL,
`kdr` decimal(6,3) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=956 ;
一些示例数据:
1, 1365175892, user1, 1089, 191, 5.702
2, 1365175892, user2, 1805, 547, 6.709
3, 1365175892, user3, 104397, 2272, 45.949
4, 1365175892, user1, 1163, 200, 5.815
5, 1365175892, user2, 1090, 204, 5.343
杀戮和死亡人数随时间增加,因此很容易创建前 10 名。
问题
对于杀戮与死亡比率 (KDR),该值可以随时间上升或下降。 示例:更新 5 中的 user2 的 KDR 低于更新 2 中的 KDR,但我的高分列表仍然显示更新 2 中的最高 KDR,而我实际上需要更新 5 中的较低 KDR。
因此,对于前 10 名,我不需要最高值(这将自动成为为每个玩家存储的最后一个值),而是最新值(这不一定是最高值)。 我无法让它工作......
我尝试过的查询之一适用于仅增加统计数据:
SELECT s.*
FROM stats AS s
INNER JOIN
(
SELECT username, MAX(kdr) AS kdr
FROM stats
GROUP BY username
) AS groupedstats
ON s.username = groupedstats.username
AND s.kdr = groupedstats.kdr
ORDER BY kdr DESC
LIMIT 10
有人可以帮助我如何获得正确的 kdr 高分列表吗?我迷路了...
谢谢
最佳答案
假设您想要 kdr 的前 10 名作为每个用户的最新记录,请尝试:
SELECT s.*
FROM stats AS s
INNER JOIN
(
SELECT username, MAX(`stamp`) AS `stamp`
FROM stats
GROUP BY username
) AS groupedstats
ON s.username = groupedstats.username
AND s.`stamp` = groupedstats.`stamp`
ORDER BY kdr DESC
LIMIT 10
关于Mysql查询最新高分,而不是最高高分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16296915/