2013-05-06 177 views
5

我有一个数组,我想按字母顺序排序,但也是由数字结尾。mysql排序字母和数字

"SELECT DISTINCT Number FROM database WHERE 1 Order By Number ASC"; 

这是它目前是如何排序:

Number 1 
Number 10 
Number 11 
Number 2 
Number 3 
Number 4 
Number 5 
Number 6 
Number 7 
Number 8 
Number 9 
The End 

这是我希望它进行排序:

Number 1 
Number 2 
Number 3 
Number 4 
Number 5 
Number 6 
Number 7 
Number 8 
Number 9 
Number 10 
Number 11 
The End 
+1

看起来你的号码栏是一个字符串值。您可以尝试在订购前将其转换为整数 – 2013-05-06 06:55:39

+0

试试我的答案。它工作正常。 – 2013-05-06 07:20:02

+0

[自然排序在MySQL]中可能的重复(http://stackoverflow.com/questions/153633/natural-sort-in-mysql) – Ejaz 2013-05-06 12:04:18

回答

6

添加其他排序条件:

Order By LENGTH(Number), Number; 

这因为更长的数字也是一个更大的数字;对于相同长度的数字,可以进行文本比较,因为'0' < '1' .... < '9'

+0

这是否会始终工作,因为我真的觉得可能有一些隐藏的捕获。 – Aquillo 2013-05-06 06:59:24

+0

@Aquillo我已经添加了解释它为什么有效。随意找到一个案例,它给出了错误的结果:) – 2013-05-06 07:03:11

+0

我一直在使用这种方法多年。有用! +1 – Fluitketel 2013-05-06 07:46:52

0

sql有函数在排序时将字符串转换为整数。

如果你正在使用MySQL,这是你用来做你想做的是什么:

SELECT DISTINCT Number FROM database Order By CAST(Number AS UNSIGNED) ASC 

如果您使用的是不同的数据库,则需要Google如何投一列的整数为您的数据库。

注意:其他一些解决方案的工作......但有点哈克 - 即他们看起来很酷,但未来可能无法正常工作。上述不正是你想要什么,你是如何“应该”做的;)

+0

'SELECT CAST('Number 11'AS UNSIGNED)'yield'0' – 2013-05-06 07:04:58

+0

为什么你要给它传递一个字数字的字符串? 不要传递“数字11”,传递“11”或名为数字的列 – 2013-05-06 07:19:06

+0

Try: 'SELECT CAST('11'AS UNSIGNED)''你正确得到'11' – 2013-05-06 07:20:38

2

试试这个: -

SELECT distinct numberr FROM tablename Order By cast(substring(numberr,7) as unsigned int) ASC ; 

其工作的罚款。

出放: -

Number 1 
Number 2 
Number 3 
Number 4 
Number 5 
Number 6 
Number 7 
Number 10 
Number 11 
+0

它不按字母顺序排序。 – 2013-05-06 07:22:57

+1

只有在开始处的字符串始终为7个字符的情况下才能使用......您无法保证。 – 2013-05-06 07:24:08

+0

是@TarynEast你是对的。 – 2013-05-06 07:26:01

0
"SELECT DISTINCT Number FROM database WHERE 1 Order By substring_index(Number,'Number',1),cast(substring_index(Number,'Number ',-1) as unsigned int) ASC"; 
+0

'结局'会发生什么? – Aquillo 2013-05-06 09:55:46

+0

@Aquillo,你的意思是'结束'而不是'数字'字符串? – Amir 2013-05-06 10:37:17

+0

而不是“数字9”,例如,在提供的示例中。 – Aquillo 2013-05-06 11:01:46

0

有点迟到了。但你也可以使用另一种方法。从查询中获取结果,然后用php对它们进行排序。这里试试这个。

natsort($results); // results has your query results use natural sort. 
$sorted_array = array_values($the_array); // then reorder the index 

希望能帮助别人。 :)