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查询高分排行榜的问题的主要内容,如果未能解决你的问题,请参考以下文章