Mysql查询最新高分,而不是最高分

时间:2013-04-30 09:49:48

标签: mysql

编辑:由Ian&标记...

游戏的高分需要从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名,我不需要最高值(这将是自动为每个玩家存储的最后一个值),而是LATEST值(不一定是最高值)。 我无法让它发挥作用......

我尝试的其中一个查询是适用于仅增加统计数据的查询:

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高分榜?我迷路了...

由于

2 个答案:

答案 0 :(得分:1)

假设你希望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

答案 1 :(得分:1)

这样的东西?

select * from stats where id in ( 
  select max(id) as maxid 
  from stats
  group by username
)
order by kdr desc limit 10