MySQL查询高分排行榜的问题

Posted

技术标签:

【中文标题】MySQL查询高分排行榜的问题【英文标题】:Problem with MySQL query for high scores leaderboard 【发布时间】:2010-07-24 17:05:00 【问题描述】:

我有一个游戏的 mysql 高分表,它显示了过去一年中每一天的每日高分。现在我正在做一个 php for-loop 并为每一天做一个单独的查询,但是表变得太大而不能这样做,所以我想把它压缩成一个简单的 MySQL 语句。

这是我现在的新查询(date_submitted 是一个时间戳):

SELECT date(date_submitted) as subDate, name, score FROM highScores WHERE date_submitted > "2009-07-16" GROUP BY subDate ORDER BY subDate DESC, score DESC LIMIT 10;

输出:

+------------+------------+--------+
| subDate    | name       | score  |
+------------+------------+--------+
| 2010-07-18 | krissy     | 959976 |
| 2010-07-10 | claire     | 260261 |
| 2010-07-05 | krissy     | 771416 |
| 2010-06-19 | krissy     | 698031 |
| 2010-06-18 | otli       | 264898 |
| 2010-06-15 | robbie     |  82303 |
| 2010-06-01 | dad        | 480469 |
| 2010-05-29 | vicente    | 124149 |
| 2010-05-27 | dad        | 564007 |
| 2010-05-26 | caleb      | 502623 |
+------------+------------+--------+

我的问题是,当它按 subDate 分组时,它取了当天最早时间戳的最高分,正如您在下一个查询中看到的那样:

SELECT name, score, date_submitted FROM highScores WHERE date(date_submitted)='2010-06-15' GROUP BY name ORDER BY score DESC;

输出:

+--------+--------+---------------------+
| name   | score  | date_submitted      |
+--------+--------+---------------------+
| john   | 304095 | 2010-06-15 22:58:02 |
| april  | 247126 | 2010-06-15 21:25:31 |
| orli   | 166021 | 2010-06-15 21:25:31 |
| robbie |  82303 | 2010-06-15 11:38:39 |
+--------+--------+---------------------+

如您所见,可怜的约翰应该是 2010-06-15 的领导者。任何人都可以帮忙吗?希望这是我忽略的真正简单的事情。我尝试在第一个查询的 FROM 部分之前使用 max(score),它给了我正确的分数,但没有保留名称。

感谢您的帮助。

【问题讨论】:

【参考方案1】:
SELECT userName, userScore, subDate FROM (
    SELECT 
        userName,
        userScrore,
        DATE(submitDate) as subDate,
        @rn := CASE WHEN @subDate = DATE(submitDate)
                THEN @rn + 1
                ELSE 1
           END AS rn,
        @subDate := DATE(submitDate)
    FROM (SELECT @subDate := NULL) vars, highScores
    ORDER BY submitDate, userScore DESC
) deriv
WHERE rn=1;

另请参阅另一个'highest record per something'-question的答案

【讨论】:

嘿,谢谢。这超出了我的 MySQL 经验,但我想我开始理解它了。但是,当我从 MySQL 命令行运行它时: SELECT name, score, subDate FROM ( SELECT name, score, DATE(date_submitted) AS subDate, @rn ..... etc...我收到此错误:ERROR 1064 (42000):您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“SELECT name, score, DATE(date_submitted) AS”附近使用正确的语法 嘿,谢谢。我只是再次尝试并重写它而不是复制粘贴并且它有效!我得到的错误是一些额外的空白行或复制它的东西。【参考方案2】:

添加一个

ORDER BY userScore DESC 

在第二个查询结束时。

【讨论】:

我将“ORDER BY score DESC”放在第二个查询的末尾。这样查询就可以正确排序了。 我只是尝试在第一个查询中将“score DESC”更改为“score ASC”,只是为了查看它是否确认了 ORDER BY 的第二部分,它在第一个查询中给了我完全相同的输出所以这很奇怪。 看起来它纠正了第二个输出,除非我弄错了。 是的,它现在对第二个输出进行排序。它将 john 显示为当天的最高分,但在第一个查询中,我是否得分 ASC 或得分 DESC 并不重要。我想也许我可能不得不做一些复杂的事情,比如第二个答案。

以上是关于MySQL查询高分排行榜的问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询排行榜, 查询用户第几名

现在要查询一个字段至少包括两个中文字,高分急求SQL语句,谢谢~~~

MYSQL查询包含1个查询中我需要的两件事

提高Mysql查询性能

数据查询 sql sever 2005

sql 如何查询每个班级中的最高分