如何在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
时,我只能按字母字符获取结果顺序。我怎么得到这个?
答案 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,并将触发器分离到两个新字段。这样,数据的格式可以在输入或更新时自动排序,所有当前代码仍然有效,但您可以重构以使用更高性能的排序。