编辑:由伊恩和马克解决...

游戏的高分需要从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

10-07 14:01