我有一个游戏排行榜,它通过mySQl数据库中的PHP地图显示顶级游客;
SELECT name, time, MAX(score) as max_score
FROM leaderboards
WHERE name != '' AND hidden=0 AND map='" .$currMap. "' AND score > 0
GROUP BY name
ORDER BY score DESC, time ASC LIMIT ".($get_page*10).", 10
我在10s内对网站上显示的结果进行了分页。
Theres是有几个人有多个分数。他们的记录没有显示在列表中的位置。相反,他们在最低分的位置进一步向下显示,但是最高的值。所以它没有正确排序。
有什么建议吗?
答案 0 :(得分:1)
这并没有拉长与该分数相关的时间。它正在提升任意记录。您的查询使用的是MySQL扩展程序,其中select
(time
)中的列不在group by
中。正如documentation中所述*明确表示的那样,您从不确定的行中获取值。
使用substring_index()
/ group_concat()
技巧可以获得所需内容的一种方法:
SELECT name,
SUBSTRING_INDEX(GROUP_CONCAT(time ORDER BY score DESC), ',', 1) as TimeAtMaxScore,
MAX(score) as max_score
FROM leaderboards
WHERE name <> '' AND hidden = 0 AND map='" .$currMap. "' AND score > 0
GROUP BY name
ORDER BY score DESC, time ASC LIMIT ".($get_page*10).", 10;
(注意:我使用的是文档的5.6版本,因为它更明确地说明了会发生什么。Version 5.7更好地解释了什么是功能依赖,这是此扩展的基础。在某些情况下,ANSI标准确实允许它。)
编辑:
order by
中存在同样的问题。你可以这样做:
ORDER BY max_score DESC, TimeAtMaxScore ASC
LIMIT . . .