1

编辑:由 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

Kills & Deaths 随时间递增,因此创建前 10 名很简单。

问题

对于 Kill to Death Ratio (KDR),该值可以随时间上升或下降。示例:更新 5 中的用户 2 的 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 高分列表?我迷路了...

谢谢

4

2 回答 2

2

假设您希望每个用户的最新记录按 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
于 2013-04-30T09:57:14.560 回答
2

像这样的东西?

select * from stats where id in ( 
  select max(id) as maxid 
  from stats
  group by username
)
order by kdr desc limit 10 
于 2013-04-30T10:10:12.447 回答