3

当 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

4 回答 4

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)
于 2010-06-03T21:36:35.440 回答
6

假设您的字符串始终以 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 不支持功能索引,所以这个查询会比较慢。最好重新设计您的数据库(例如单独存储数字),这样就不需要对函数的值进行排序。

于 2010-06-03T21:25:40.910 回答
0

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

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

于 2011-09-22T14:10:23.043 回答
0

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

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

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

AB CD EF GH

或者

01 02 03 04

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

谢谢

谢谢!

于 2010-09-21T16:08:57.900 回答