【问题标题】:SQL recordset confusing resultsSQL 记录集混淆结果
【发布时间】:2014-11-15 21:42:16
【问题描述】:

我的游戏有一个排行榜,它通过来自 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

我正在分页 10 秒后网站上显示的结果。

那里有几个人有多个分数。他们的记录没有出现在他们应该在名单上的位置。相反,他们在最低分数的位置上显示得更远,但价值最高。所以它没有正确排序它们。

有什么建议吗?

【问题讨论】:

  • 你试过... ORDER BY MAX(score) DESC, time ASC ...吗?
  • 为这个 2900 分数的家伙做隐藏和映射属性是否可以(在查询中合格)?
  • @EugenRieck 我认为我们不能将聚合函数与 order by 一起使用

标签: php mysql sql


【解决方案1】:

它没有拉起与该分数相关的时间。它正在拉起任意记录。您的查询正在使用 MySQL 扩展,其中 select (time) 中有一个列不在 group by 中。正如 documentation 中 *explicitly 所述,您从不确定的行中获取值。

使用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 . . .

【讨论】:

  • 它仍然没有提取某些记录。如果五个提交分数的用户中的一个说 hidden=1 是否意味着他不会被全部包含在内?或者只是没有那个记录?如果我删除 GROUP BY,他会出现
  • @user1022585 。 . .通过where 子句的每个名称都将出现在group by 中(在一行上)。尝试删除limit
  • 我取消了限制,缺少的球员的名字显示在底部,在他最低分的位置,但在他的最高分的位置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多