Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql查询最新的高分,而不是最高的高分_Mysql - Fatal编程技术网

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

Mysql查询最新的高分,而不是最高的高分,mysql,Mysql,编辑:由伊恩和马克解决 游戏的高分需要从MySQL数据库中获取(使用php)。 我使用的查询可以很好地处理总是随时间增加的统计数据。 但是,查询不适用于可以随时间上升或下降的统计数据 一些细节: 玩家的统计数据存储在stats表中。每个播放器有多行(所有更新),一个自动增量列是主键 CREATE TABLE IF NOT EXISTS `stats` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stamp` bigint(20) NOT NU

编辑:由伊恩和马克解决

游戏的高分需要从MySQL数据库中获取(使用php)。 我使用的查询可以很好地处理总是随时间增加的统计数据。 但是,查询不适用于可以随时间上升或下降的统计数据

一些细节:

玩家的统计数据存储在
stats
表中。每个播放器有多行(所有更新),一个自动增量列是主键

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中的用户2的KDR比更新2中的低,但我的高分列表仍然显示更新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为每个用户的最新记录排名前十,请尝试:

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

假设您希望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
像这样的

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

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

最新的一个是id最高的,对吧?在这种情况下,它让人相信你自己无法解决这个问题!最新的一个是id最高的,对吧?在这种情况下,它让人相信你自己无法解决这个问题!谢谢,这正是我需要的!你让它看起来很简单。一旦你明白了,事情就简单了。此外,此查询产生的结果与下面Mark Bannister的答案完全相同。。。太糟糕了,我不能提高投票率,因为我没有足够的尊重点马克已经回答了问题(计算出最新的邮票)。我走了一条捷径(可能是因为我有点懒),并假设最新的邮票也会有最高的IDFW,马克·班尼斯特的答案可能会表现得更好——特别是在更大的数据集上。我会认为他的回答是正确的。此外,它与您自己的查询非常相似(除了我确信它的本意是MAX(id)),所以您自己也无法理解它;-)谢谢,这正是我需要的!你让它看起来很简单。一旦你明白了,事情就简单了。此外,此查询产生的结果与下面Mark Bannister的答案完全相同。。。太糟糕了,我不能提高投票率,因为我没有足够的尊重点马克已经回答了问题(计算出最新的邮票)。我走了一条捷径(可能是因为我有点懒),并假设最新的邮票也会有最高的IDFW,马克·班尼斯特的答案可能会表现得更好——特别是在更大的数据集上。我会认为他的回答是正确的。此外,它与您自己的查询非常相似(除了我确信它的本意是MAX(id)),所以您自己也无法理解它;-)谢谢,这正是我需要的!你让它看起来很简单。一旦你明白了,事情就简单了。此外,此查询产生的结果与上面Ian Kenney的答案完全相同。。。太遗憾了,我不能投票,因为我没有足够的尊重点谢谢你,这正是我需要的!你让它看起来很简单。一旦你明白了,事情就简单了。此外,此查询产生的结果与上面Ian Kenney的答案完全相同。。。太遗憾了,我不能投票,因为我没有足够的尊重分数