编辑:由伊恩和马克解决...
游戏的高分需要从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具有比更新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