MySQL ORDER BY以(显然)随机顺序返回内容?

时间:2010-03-08 22:15:53

标签: mysql enums sql-order-by

以下查询:

SELECT DISTINCT ClassName FROM SiteTree ORDER BY ClassName

回归的事情没有明显的顺序!

无论是引用列/表名,还是使用DISTINCT,或添加ASCDESC,我都会得到相同的结果。

我认为索引可能会被破坏,或类似的东西,所以尝试删除和重新创建。 还尝试了REPAIR TABLECHECK TABLE

表格排序设置为latin1_swedish_ci。 所有文本列都设置为使用UTF-8,并且排序规则设置为utf8_general_ci

导致这种情况的原因是什么?

编辑:

pastie的示例数据。

结果直接来自MySQL客户端中执行的SQL查询(尝试了2个不同的客户端应用程序)。

5 个答案:

答案 0 :(得分:3)

您的数据是如何加载的?我曾经看过一些情况,从一些外部源加载已经在字符串的第一个位置放置了一个空格或其他类似的字符 - 结果是返回的结果集实际上是排序的,但不像人们期望的那样。

检测到这种事情是非常困难的,如果我得到的类型的异常结果,我看到的第一件事我倾向于选择有问题的字段连接'>'和'<'。

答案 1 :(得分:2)

尤里卡!

虽然使用函数确实会返回正确的顺序,例如:

  SELECT DISTINCT ClassName FROM SiteTree ORDER BY REPLACE(ClassName,'','')

事实证明我正在查看ENUM专栏(我忘记了,认为这是纯文本), 因此MySQL根据ENUM中项目的顺序进行排序。

感谢您提供有用的建议。

鉴于这种情况,这是一个合理的解决方案。

SELECT DISTINCT ClassName FROM SiteTree ORDER BY CAST(ClassName AS CHAR) 

答案 2 :(得分:1)

没有理由这样做,看看摆脱骆驼外壳的混合是否有所不同:

  SELECT DISTINCT LOWER(LTRIM(ClassName)) AS classname 
  FROM SiteTree ORDER BY classname

我非常喜欢Cruachan的想法,我更新了我的想法以涵盖它。删除前导空格。

答案 3 :(得分:0)

表可能或者确实可能在DISTINCT之前对表进行排序。尝试使用聚合函数或GROUP BY

答案 4 :(得分:0)

如果您在网页上查看结果,您可能只是看到来自早期查询的缓存结果集。