【问题标题】:MySQL ORDER BY returns things in (apparently) random order?MySQL ORDER BY 以(显然)随机顺序返回东西?
【发布时间】:2010-03-08 22:15:53
【问题描述】:

以下查询:

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 个不同的客户端应用程序)。

【问题讨论】:

  • 欢迎来到 SO Luke。请提供一些示例数据!
  • 我尝试添加 ASC / DESC,因为我真的很疯狂 :)

标签: mysql enums sql-order-by


【解决方案1】:

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

检测这类事情可能非常困难,如果我得到你所看到的类型的异常结果,我倾向于做的第一件事就是选择连接“>”和“

【讨论】:

  • 这将是我要检查的第一件事,执行“SELECT char_length(ClassName), ClassName”并查找异常情况。
  • 在这种情况下没有这样的问题,但检查总是一件好事。
【解决方案2】:

尤里卡!

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

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

原来我正在查看一个 ENUM 列(我忘记了,以为是纯文本), 所以 MySQL 是根据 ENUM 中项目的顺序进行排序的。

感谢您提供有用的建议。

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

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

【讨论】:

  • 当用户意识到他们只是忘记了某些东西时,我通常不会 +1,但您的回答说明了其他人可以轻松找到自己的情况并提供修复它的功能。很高兴您解决了问题并发布了通知我们。
  • 干杯!我在这里找到了很多有用的东西,希望我能从那些头撞桌子的时刻中拯救别人。
【解决方案3】:

这没有理由起作用,看看摆脱骆驼肠衣的混合是否会有所作为:

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

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

【讨论】:

    【解决方案4】:

    有可能,或者确实有可能,该表在DISTINCTing 之前排序。尝试使用聚合函数或GROUP BY

    【讨论】:

    • 即使表在 distinct 之前排序,它仍然会被排序。
    【解决方案5】:

    如果您正在查看网页上的结果,您可能只是看到了先前查询的缓存结果集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2010-11-10
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多