SQL记录集令人困惑的结果

时间:2014-11-15 12:35:59

标签: php mysql sql

我有一个游戏排行榜,它通过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是有几个人有多个分数。他们的记录没有显示在列表中的位置。相反,他们在最低分的位置进一步向下显示,但是最高的值。所以它没有正确排序。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这并没有拉长与该分数相关的时间。它正在提升任意记录。您的查询使用的是MySQL扩展程序,其中selecttime)中的列不在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 . . .