2012-01-25 71 views
3

有沒有辦法在MySQL中的元素是這樣排序:MySQL的順序由字母 - 數字

元素:

  1. 市1
  2. 市2
  3. 市10
  4. 市1A

當我做的ORDER BY列表看起來這樣:

  1. 市1個
  2. 市1A
  3. 市10
  4. 市2

因爲所有的答案不匹配我的特殊問題,我編輯我的問題。 還有數字後面帶有字符的元素。觀看例子

+1

[數值順序從MySQL返回結果時(可能重複http://stackoverflow.com/questions/3356190/numeric -order-when-returns-results-from-mysql) –

回答

3

我用這個和它工作得很好:

ORDER BY LENGTH(Elements), Elements 
+0

這隻有在你的數據庫包含「City XXXXX」形式的* only *元素時纔有效。 –

+0

此解決方案的問題是,它不再按字母排序。如果數字出現在「a」,「b」之後,它也不起作用。 – StrongLucky

+0

正確,但在大多數情況下,我通常會面對這種情況,它功能強大且速度很快。現在在編輯問題中,我的答案是錯誤的,@Devart答案是正確的 – tommasop

0

你要提取由「城市」的數字部分和秩序。

SELECT city 
FROM ... 
ORDER BY (SUBSTRING(city,6)+0) 

這會從「城市」(從第6個字符開始)抓取數字並轉換爲字符串進行排序。

+0

如果城市名稱長於或短於此示例,該怎麼辦? – dgw

+0

如同,城市名稱因行而異?然後它有點困難。數字始終是字符串中的最後一個單詞嗎? (另外,如果有特殊情況需要這些,請更新您的問題,以便我們給出適當的答案)。 –

4

嘗試這一招 - 'ORDER BY列名+ 1',例如:

SELECT * FROM element 
ORDER BY column_name+1; 
+0

只有當column_name中的值以數字開頭時,纔會出現這種情況。即如果你有'10a城市',這將起作用,但'城市10a'不會。在後一種情況下,您需要分割值中的空格並僅評估右半部分,從而確保在執行+0技巧之前處理數字開始值。 – JaredC

+0

是的,在這種情況下,字段值必須被解析,然後排序,這對性能不利。同意類型轉換 - [當它撿起行時,它應該不會?](http://stackoverflow.com/questions/11773473/mysql-picking-row-when-it-shoudnt/11773592#11773592)。 – Devart