2013-05-04 116 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