2011-05-04 42 views
1

考慮這種情況,我有一個表名 「測試」MySQL的排序問題

 

------- 
content (varchar(30)) 
------- 
1 
abc 
2 
bcd 
------- 
 

,如果我通過

Select * from test order by content asc

使用順序,我能得到導致像


-------- 
content 
-------- 
1 
2 
abc 
bcd 
--------- 

但有沒有什麼辦法,我可以得到以下結果使用查詢


-------- 
content 
-------- 
abc 
bcd 
1 
2 
--------- 

回答

2

要通過整理得到的,你可以通過測試的第一個字符做......看來你想要的任何東西開始用數字表示任何以alhpa爲導向的東西......類似於Ted的ISNUMERIC()表示,但是我的快速檢查並沒有在MySQL中顯示這樣的函數..所以一個替代方案...因爲ASCII列表中的數字小於「A」(char 65)

Select * 
    from test 
    order by 
     case when left(content, 1) < "A" then 2 else 1 end, 
     content 

雖然我看過d不同的CONVERT()調用,我沒有MySQL可用來確認。但是,除了上面的case/when之外,還可以添加SECOND case/when,並在「content」值上調用某個UDF()或其他轉換函數。如果字符串以alpha開始,它應該返回一個零值,所以第一個case/when將使它們保持在列表的頂部,然後因爲所有都不可轉換爲數字將具有零值...沒有影響最後是內容本身,它將以字母順序保持。然而,如果你的第二種情況/當/轉換函數調用DOES返回一個數值,那麼它將在數值分組段中正確排序...然後,它將取代內容...但是,如果內容是像

100 smith rd and 
100 main st 

,他們將在同一個 「100」 的範疇數值進行排序,但隨後按字母順序由內容

100 main st 
100 smith rd 
+0

謝謝DRapp ..它工作良好..除了排序數字時,如果我們有1,5,200,30它排序像1,200,30,50(因爲它的varchar類型) – balanv 2011-05-04 12:00:36

+0

非常好的答案! – 2011-05-04 12:01:09

+0

@balanv,爲您嘗試更多的方向更新答案。 – DRapp 2011-05-04 13:16:39

0

結果的順序是使用排序規則定義的,所以如果你能找到正確的排序規則,那麼是的。

http://dev.mysql.com/doc/refman/5.0/en/charset-collate.html

//編輯

這是棘手。我已經做了一些研究,看來目前沒有可用的排序規則可以做到這一點。不過也有可能爲MySQL添加新的排序規則。 Here's how.

+0

確定我應該使用什麼樣的排序規則達到預期的結果..? – balanv 2011-05-04 11:51:44

0

不知道在MySQL,但SQL Server,您可以做到這一點的?

SELECT * FROM test 
ORDER BY IsNumeric(content), content 
1
select * from sometable order by content between '0' and '9', content 
+0

感謝這與DRapp解決方案相同... – balanv 2011-05-04 12:44:16

2

這將做到這一點:

SELECT * 
FROM test 
ORDER BY CAST(field AS UNSIGNED), field ASC 
+0

嘿謝謝布賴恩..這個查詢是偉大的...並解決了數字排序問題... – balanv 2011-05-04 12:53:43