【问题标题】:Alphanumeric Order By in MysqlMysql中的字母数字顺序
【发布时间】:2011-02-27 12:46:05
【问题描述】:

当mysql中包含字母数字字符的列时,我怎样才能只进行数字排序?

列(名称)是唯一字段。

我的表包含记录,

id  name
1   ab001
2   ab010
3   aa002
4   ac004
5   ba015
6   ba006
7   aa005
8   ac003

结果一定是这样的,

id  name
1   ab001
3   aa002
8   ac003
4   ac004
7   aa005
6   ba006
2   ab010
5   ba015

当我尝试此查询Select * from test order by name 时,我仅按字母字符顺序获取结果。我怎么得到这个?

【问题讨论】:

    标签: mysql sql-order-by alphanumeric


    【解决方案1】:

    我会这样做:

    select id, name from Table1 order by names + 0, names;
    

    无序:

    mysql> select * from alpha;
    +---+-------+
    | i | name  |
    +---+-------+
    | 1 | ab001 |
    | 2 | ab010 |
    | 3 | aa002 |
    | 4 | cc001 |
    | 5 | cb010 |
    | 6 | aaa02 |
    +---+-------+
    6 rows in set (0.00 sec)
    

    根据我的查询:

    mysql> select i, name from alpha order by name + 0, name;
    +---+-------+
    | i | name  |
    +---+-------+
    | 3 | aa002 |
    | 6 | aaa02 |
    | 1 | ab001 |
    | 2 | ab010 |
    | 5 | cb010 |
    | 4 | cc001 |
    +---+-------+
    6 rows in set (0.00 sec)
    

    【讨论】:

    • 非常感谢,它适用于我的序列 1A、2A、5C、15D、20A... 对字母数字数据进行排序的好解决方案
    【解决方案2】:

    假设您的字符串始终以 3 位数字结尾,您可以使用 RIGHT:

    SELECT id, name
    FROM Table1
    ORDER BY RIGHT(name, 3);
    

    结果:

    1, 'ab001' 3、'aa002' 8, 'ac003' 4, 'ac004' 7、'aa005' 6、'ba006' 2、'ab010' 5、'ba015'

    MySQL 不支持functional indexes,所以这个查询会比较慢。最好重新设计您的数据库(例如单独存储数字),这样就不需要对函数的值进行排序了。

    【讨论】:

    • 任何时候你按顺序使用一个函数,就该考虑重构你的数据库了。
    • 谢谢,它工作得很好,但它最适合特定长度值。
    【解决方案3】:

    我遇到了一个稍微不同的问题,但第二个示例对我有用。我会投赞成票,但我才刚刚开始。

    我正在处理单个 varchar 列,它可以包含任何类型的信息,但无论其中包含什么,它都需要正确排序:

    所以我的专栏可能包含以下信息:

    AB 光盘 英孚 生长激素

    或

    01 02 03 04

    Xavier 的回答导致当信息全部按字母顺序时按字母顺序排列,或者当信息为数字时按数字顺序排列。

    谢谢

    谢谢!

    【讨论】:

      【解决方案4】:

      如果您将前 X 个字符作为字母,其余字符作为数字,并且字母字符各不相同,则最好更改结构以将这些数据放在两列中 - 一列用于初始字母,另一列用于数字。现在您不必每次订购时都进行转换,您只需先在字母列上订购,然后在数字列上订购。重新设计你的结构确实是更好的方法,特别是如果你经常订购或者如果你有一个大的数据集。

      您甚至可以将当前字段保留为 PK,并为两个新字段单独设置一个触发器。这样,数据会以一种可以在输入或更新时自动排序的格式放置,所有当前代码仍然可以工作,但您可以重构以使用更高性能的排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多