【问题标题】:Sort MySQL results alphabetically, but with numbers last按字母顺序对 MySQL 结果进行排序,但数字最后
【发布时间】:2011-05-02 19:57:43
【问题描述】:

通常,排序是使用排序到顶部的符号完成的,例如 0*&。这是mysql排序的默认方式;数字和符号,然后是 A-Z。但是,这会使通常最丑陋或格式最差的结果浮到顶部(例如,@#$@34238 inch&amp 的结果)。

所以我想做一个修改后的形式,字母首先是 A-Z,然后是特殊字符。

我将如何创建这种类型的排序? ORDER BY 子句中的内容?

【问题讨论】:

    标签: mysql sql-order-by alphabetical-sort


    【解决方案1】:

    基于此页面的 google 缓存链接: http://www.google.com/url?sa=t&source=web&cd=3&ved=0CCUQFjAC&url=http%3A%2F%2Fblog.feedmarker.com%2F2006%2F02%2F01%2Fhow-to-do-natural-alpha-numeric-sort-in-mysql%2F&ei=Zg2_TZyKDaffiALjjqwo&usg=AFQjCNGS-rX7AmfrumXK8J7bVSj96bSSmQ

    编辑:原始链接已失效。 这是另一个链接,它实际上比第一个链接更好地解释了正在发生的事情:

    http://matthewturland.com/2008/11/05/natural-ordering-in-mysql/

    你可以试试这个

    SELECT names FROM your_table ORDER BY names + 0 ASC
    

    【讨论】:

    • 嗯,无法直接访问它的缓存链接。
    • webcache.googleusercontent.com/… 该缓存链接应该可以工作。不确定 - 为什么 - 添加的 0 有效,但确实有效!
    • 这怎么可能与 ABC0123DEFABCDEFGHIJKL 之类的东西一起使用?
    • @Thomas 老实说,我也不确定它为什么会起作用。
    • 从我读过的内容来看,我认为这可能只有当第一个字符是数字时。我不在一个可以运行测试的地方,但我很想知道这是否适用于ABC0123456ABC0123DEF0123456ABCABCDEFGHI 等变体。
    【解决方案2】:
    Select ...
    From ...
    Order By Case When Col Like '[0-9]%' Then 1 Else 0 End Asc
        , Col
    

    另一种解决特殊字符的方法:

    Select ...
    From ...
    Order By Case When Col Like '[A-Z]%' Then 0 Else 1 End Asc
        , Col
    

    【讨论】:

    • 这仅处理字符串的第一个字符。我假设 OP 希望将排序逻辑应用于整个字符串。例如,aa 应该排在a1a! 之上。
    • 是的,一致的排序更改会很好。
    • @Tchalvak - 你的意思是你想让ABC123 排在ABDEFG 之后吗?如果是这样,没有简单的方法可以做到这一点。您最好的选择可能是使用正则表达式替换将数字替换为在底部附近排序的数字(如“Z”)并对其进行排序。
    • @Tchalvak - 顺便说一句,特殊字符或数字总是在末尾而不是开头还是在文本中间?
    【解决方案3】:

    这对我有用:

    SELECT * FROM `yourTable` ORDER BY `yourDatabase`.`yourColumn`  ASC
    

    【讨论】:

    • 不,这将首先显示数字,然后是字母,而 DESC 将转到 z 到 a,然后从 9 到 0,这两者都不理想。不过,接受的答案效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多