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

标签 mysql

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

相关文章:

mysql - 用于 Web 应用程序的大容量数据的后端技术

php - 对不同的 MySQL 行执行函数

php - 使用 DIV 回显结果

mysql - 在 Mysql 中,您可以编写多少次 Select Inside Select 查询?

mysql - 如何在一个触发器中放置多组方程式

python - 缓存通过 API 获取的在线价格,除非它们发生变化

mysql - 通过返回 null 进行分组

尽管缺少子查询,但 MySQL 更新错误为 "Subquery returns more than 1 row"

mysql - 尝试使用 IF 语句和计算列删除查询中的记录

MySql:日期的默认值无效