我有一個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高。
我該如何解決?
我有一個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高。
我該如何解決?
不知道表versions
是如何定義的,它很難回答,但看起來好像它正在被搜索爲文本,在這種情況下,86大於124(思考字典順序)。 一個簡單的解決方案可能是將表格中的數據以兩種格式存儲 - 保留您似乎有的字符串,並且具有十進制等值,例如25.0.1364.86作爲字符串,2501364.86作爲小數。這將確保您的訂購按預期工作。
如果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 |
@Skylineman你的問題需要更多幫助嗎? – peterm 2013-03-17 06:52:45
這裏是我的方法(希望你不介意我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 |
唯一的問題是,我們不知道版本號有多長:/ – Skylineman 2013-03-13 21:59:18
沒有固定格式的版本 – Skylineman 2013-03-13 22:09:22
將其拆分應該仍然有效。 – Kermit 2013-03-14 00:06:59
小的提升,從@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 |
這太棒了,謝謝! – zoltar 2014-05-20 22:03:59
參加派對已晚,但使用INET_ATON()函數可以更簡單地回答此問題。
SELECT * FROM versions ORDER BY INET_ATON(version)
將輸出
23.0.1271.100
25.0.1364.86
25.0.1364.124
瞭解更多關於INET_ATON()位置:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton
商店作爲4個整數列 - 'major','minor','patch'和'build' – zerkms 2013-03-12 23:37:28
你的問題是他們不是小數,他們是字符串。因此,他們被比作字符串。 – 2013-03-12 23:38:18
@MarkParnell什麼是分辨率? – Skylineman 2013-03-12 23:39:25