2013-05-04 93 views
5

您好我想排序表.The字段包含数字,字母和数字字母与IE,需要帮助的排序在mysql中

 
1 
2 
1a 
11a 
a 
6a 
b 

我想这个排序来,

 
1 
1a 
2 
6a 
11a 
a 
b

我的代码,

SELECT * FROM t ORDER BY CAST(st AS SIGNED), st
但结果是,

 
a 
b 
1 
1a 
2 
6a 
11a 

我发现这个代码在这个网址

" http://www.mpopp.net/2006/06/sorting-of-numeric-values-mixed-with-alphanumeric-values/ "
请人帮我

+0

首先检查CAST是否返回。我认为它会将st转换为数字。运行这个查询:SELECT CAST(st AS SIGNED)FROM t – 2013-05-04 06:32:29

+0

@ asim-ishaq它只返回数字。结果是1,12,11,6,1,2,0,0 – 2013-05-04 06:42:15

+0

字母它会返回0,所以他们总是站在最前面。我们必须考虑一个不同的逻辑 – 2013-05-04 06:47:01

回答

5

即使表中存在0,这也会执行您所需的排序顺序;

SELECT * FROM t 
ORDER BY 
    st REGEXP '^[[:alpha:]].*', 
    st+0, 
    st 

An SQLfiddle to test with

  • 作为第一个排序标准,它排序什么,任何不经过以字母开始。正则表达式就是这样。
  • 由于它按字符串开头(st+0添加0到字符串开头的数字部分并返回一个int)
  • 作为最后的手段的数值的第二排序标准,它按字符串本身至按字母顺序排列。
+0

Perfecto!约阿希姆可以请解释它是如何工作的? :) – 2013-05-04 06:59:56

+0

是这是正确的答案,+1 :)我没有考虑到可能会有一些事实0 – fthiella 2013-05-04 07:03:34

+0

@Vivek添加了一个小解释,让我知道如果我需要澄清:) – 2013-05-04 07:06:51

-3

我做您的查询小的变化 -

SELECT *, CAST(st AS SIGNED) as casted_column 
FROM t 
ORDER BY casted_column ASC, st ASC 

这应该工作。 从理论上讲,你的语法应该可以工作,但不知道为什么mysql在标签之后不接受这些方法。 如此创建临时字段,然后排序该字段。

这应该按照我的经验工作,你可以检查它。

SQL FIDDLE

+0

它只返回数字。casted_column包含的是0,0,1,2,6,11,12 – 2013-05-04 06:45:07

+1

不适用于'a','b'等。它不适用于纯粹数字日期。 – 2013-05-04 06:51:41

+0

Vivek他的需要是字母数字不仅数字.. – 2013-05-04 06:56:49

0

,你得到这个输出的原因是,都喜欢“一”字,“B”等被转换为“0”,如果您通过ASC使用顺序将出现在顶部。

SELECT CAST(number AS SIGNED) from tbl 

在这个小提琴返回

1 
2 
1 
11 
0 
6 
0 

看: - SQL FIDDLE

+0

你是对的,但这不能提供解决方案! – hims056 2013-05-04 06:58:46

2

您可以使用此:

SELECT * 
FROM t 
ORDER BY 
    st+0=0, st+0, st 

使用st+0 varchar列将被铸造为int。按照st+0=0排序,将在底部放置字母数字行(st + 0 = 0,如果字符串以字母数字字符开头,则不然将为0)

请参阅小提琴here

+0

谢谢you.its工作。 – 2013-05-04 07:03:55

+1

@NavaneethaNair欢迎您,但请检查Joachim Isaksson的答案,即使您的领域有一些0,他的答案仍然有效,而我的答案会将0置于底部 – fthiella 2013-05-04 07:05:07