Mysql中的字母数字顺序

时间:2010-06-03 21:21:20

标签: mysql sql-order-by alphanumeric

如何在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时,我只能按字母字符获取结果顺序。我怎么得到这个?

4 个答案:

答案 0 :(得分:7)

我会这样做:

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)

答案 1 :(得分:5)

假设您的字符串始终以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,因此此查询相对较慢。重新设计数据库会更好(例如,单独存储数字),这样就不需要对函数值进行排序。

答案 2 :(得分:0)

我的问题略有不同,但第二个例子对我有用。我投票了,但我刚刚开始。

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

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

AB 光盘 EF GH

01 02 03 04

当信息是按字母顺序排列时,Xavier的答案使其按字母顺序排列,或者当信息为数字时,则为数字。

由于

谢谢!

答案 3 :(得分:0)

如果您有前X个字符作为字母而其余的字符作为数字且字母字符不同,那么您最好更改结构以将此数据放在两列中 - 一个用于初始字母,一个用于数字。现在,您不必每次订购都需要进行协调,您只需先在字母列上订购,然后在数字列中订购。如果您经常订购或者您拥有大型数据集,重新设计您的结构确实是更好的方法。

您甚至可以将当前字段保留为PK,并将触发器分离到两个新字段。这样,数据的格式可以在输入或更新时自动排序,所有当前代码仍然有效,但您可以重构以使用更高性能的排序。