2012-11-14 75 views
0

我有代码的列表:输出列表 - MYSQL

1A 
1B 
1C 
2A 
2B 
2C 
..... 
10A 
10B.. 
11A 
11B.. 
... 

但是,当我排序,我得到下面的顺序(我已删除从列表中的一些值,使之更短)

10A 
10A 
10B 
10B 
11A 
11A 
1A 
1A 
1B 
1B 
1C 
2B 
2B 
2B 
2B 
2C 

如何按照正确的顺序(asc)按数字值和字母顺序排列列表?

+0

看到相关http://stackoverflow.com/a/8557307/908471 –

+0

[MySQL的 'ORDER BY' - 正确排序的字母数字]的可能重复(http://stackoverflow.com/questions/ 8557172/mysql-order-by-sorting-alphanumeric-correctly) – 2012-11-14 18:47:26

回答

0

mysql并不直接支持像这样的“自然”排序,但是你可以用更复杂的order by子句来伪装它。但是,由于mysql没有捕获正则表达式,可以让你找到这些字符串中数字/字母分割的位置,所以编写一个可以适当分割的东西会很难看,所以你可以这样做:

SELECT ugly_split_function1(yourfield) AS alpha, ugly_splitfunction2(yourfield) AS numeric 
.... 
ORDER BY numeric, alpha 

最好的解决办法是将该字段拆分为两个单独的字段,以便您可以直接在各个字段上进行排序。

+0

确保你将'numeric'转换为一个整数类型,或者它仍然会排序怪异。你也可以只做'SELECT yourfield'并把分割移到'SORT'子句中,这样你就不必看结果中的丑陋了。 – Sammitch

0

如果你的代码始终是一个数字,后跟只有1个字母,下面应该工作...

SELECT code FROM table ORDER BY LENGTH(code), code 
+0

请注意,如果您的代码中的数字之后的字母数量不断变化,上述内容将会中断。 –

2

我不知道这是可能做做这样的事情,但它看起来像它是:

SELECT code 
FROM YourTable 
ORDER BY Convert(code, unsigned), code