2013-03-12 30 views
3

我有一個MySQL訂購的問題。 我的查詢:帶小數的MySQL訂單

SELECT * FROM versions ORDER BY version DESC

它列出了一些版本是這樣的:

25.0.1364.86 
25.0.1364.124 
23.0.1271.100 

不過0.124比0.86高。

我該如何解決?

+3

商店作爲4個整數列 - 'major','minor','patch'和'build' – zerkms 2013-03-12 23:37:28

+1

你的問題是他們不是小數,他們是字符串。因此,他們被比作字符串。 – 2013-03-12 23:38:18

+0

@MarkParnell什麼是分辨率? – Skylineman 2013-03-12 23:39:25

回答

0

不知道表versions是如何定義的,它很難回答,但看起來好像它正在被搜索爲文本,在這種情況下,86大於124(思考字典順序)。 一個簡單的解決方案可能是將表格中的數據以兩種格式存儲 - 保留您似乎有的字符串,並且具有十進制等值,例如25.0.1364.86作爲字符串,2501364.86作爲小數。這將確保您的訂購按預期工作。

2

如果version列的格式是固定的,那麼你可以將版本拆分成部分和ORDER BY它們。

SELECT * 
FROM versions 
ORDER BY 1*SUBSTRING_INDEX(version, '.', 1) DESC, 
     1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -3),'.', 1) DESC, 
     1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -2),'.', 1) DESC, 
     1*SUBSTRING_INDEX(version, '.', -1) DESC 

輸出:

|  VERSION | 
----------------- 
| 25.0.1364.124 | 
| 25.0.1364.86 | 
| 23.0.1271.100 | 

SQLFiddle

+0

@Skylineman你的問題需要更多幫助嗎? – peterm 2013-03-17 06:52:45

0

這裏是我的方法(希望你不介意我blogged about it):

SELECT v.version 
FROM (SELECT version, 
       Cast(Substring_index(version, '.', 1) AS UNSIGNED INTEGER) major, 
       Cast(Substring_index(Substring_index(version, '.' 
        , 2), '.', -1) AS UNSIGNED INTEGER)     minor, 
       Cast(Substring_index(Substring_index(version, '.' 
        , -2), '.', 1) AS UNSIGNED INTEGER)     patch, 
       Cast(Substring_index(version, '.', -1) AS UNSIGNED INTEGER) build 
     FROM versions) v 
ORDER BY v.major, 
      v.minor, 
      v.patch, 
      v.build 

結果

|  VERSION | 
----------------- 
| 23.0.1271.100 | 
| 25.0.1364.86 | 
| 25.0.1364.124 |

See the demo

+0

唯一的問題是,我們不知道版本號有多長:/ – Skylineman 2013-03-13 21:59:18

+0

沒有固定格式的版本 – Skylineman 2013-03-13 22:09:22

+0

將其拆分應該仍然有效。 – Kermit 2013-03-14 00:06:59

3

小的提升,從@peterm發佈查詢(與感謝!)

SELECT * 
FROM `versions` 
ORDER BY 1*SUBSTRING_INDEX(version, '.', 1) asc, 
    1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -3),'.', 1) asc, 
    1*SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', -2),'.', 1) asc, 
    1*SUBSTRING_INDEX(version, '.', -1) asc, 
    version asC# this will sort non-numeric strings 

我更復雜的值,字母,數字,破折號和點測試,因爲版本可以以任何格式編寫。

| version | 
----------- 
| a-b  | 
| a-c  | 
| ab  | 
| b  | 
| c  | 
| c.a  | 
| c.a.b | 
| c.b  | 
| c.b.a | 
| c.b.b | 
| ca  | 
| 1.2  | 
| 1.2.1 | 
| 2.1.1 | 
| 2.1.2 | 
| 3  | 
| 10  | 
| 123  | 
+0

這太棒了,謝謝! – zoltar 2014-05-20 22:03:59