代码之家  ›  专栏  ›  技术社区  ›  Luke H

mysql order by以随机顺序返回东西?

  •  4
  • Luke H  · 技术社区  · 15 年前

    以下查询:

    SELECT DISTINCT ClassName FROM SiteTree ORDER BY ClassName
    

    归还的东西没有明显的顺序!

    无论是引用列/表名还是使用 DISTINCT 或不,或添加 ASC DESC .

    我假设索引可能被破坏,或者类似这样,所以尝试删除并重新创建。 也试过了 REPAIR TABLE CHECK TABLE .

    表排序规则设置为Latin1_-Swedish_-Ci。 所有文本列都设置为使用utf-8,排序规则设置为utf8_general_ci

    这可能是什么原因造成的?

    编辑:

    样本数据位于 pastie .

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

    5 回复  |  直到 15 年前
        1
  •  3
  •   Cruachan    15 年前

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

    要检测到这类情况可能会非常困难,如果我得到的结果与您看到的类型不一致,那么我首先要做的就是选择连接“>”和“<”的相关字段。

        2
  •  2
  •   Luke H    15 年前

    尤里卡!

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

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

    结果我看到的是一个枚举列(我忘记了,以为是纯文本)。 所以MySQL是根据枚举中的项目顺序进行排序的。

    不过,谢谢你的建议。

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

    SELECT DISTINCT ClassName FROM SiteTree ORDER BY CAST(ClassName AS CHAR) 
    
        3
  •  1
  •   Anthony    15 年前

    没有理由这样做会起作用,看看除去驼色外壳的混合物是否会产生影响:

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

    我非常喜欢克鲁肯的想法,我更新了我的“走出去”的想法来覆盖它。删除前导空格。

        4
  •  0
  •   Williham Totland    15 年前

    表在前面排序是可能的,或者确实是可能的。 DISTINCT 惯性导航与制导。尝试使用聚合函数或 GROUP BY

        5
  •  0
  •   mosheb    15 年前

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

    推荐文章