2013-10-04 56 views
1

基本上,我在MySQL表中記錄了我的軟件的更新歷史記錄。當我輸出這個數據時,我希望數據按軟件版本降序排序,即最先輸出最新版本的更新信息。排序MySQL表中的更新歷史

我使用以下查詢:

SELECT * FROM updates WHERE productId='$productId' ORDER BY version DESC 

在以下試驗數據:

1.0.0 
0.9.8 
2.4.2 
1.7.0 
1.7.1 
17.2.1 

的輸出是:

2.4.2 
17.2.1 
1.7.1 
1.7.0 
1.0.0 
0.9.8 

由於2 '小數點' 的在數據中,我不能將它作爲double,float等存儲在表中,所以存儲爲varchar。

我試圖把ORDER BY version+0 DESC查詢,它不移動17.2.1到列表的頂部,但移動1.7.01.7.1因爲當它到達第二小數點鑄造突破了,所以只是輸出數據表的順序。

如何對數據進行排序的任何建議,以便它會出來爲:

17.2.1 
2.4.2 
1.7.1 
1.7.0 
1.0.0 
0.9.8 

乾杯!

+0

爲什麼不說柱打入3場?訂購記錄更容易。 –

+0

這個怎麼樣:http://injustfiveminutes.wordpress.com/2012/10/17/split-function-in-mysql/ –

回答

1

這將工作

select * from Table1 
order by CAST(SUBSTRING_INDEX(version, '.', 1) as DECIMAL) DESC, 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', 2), '.', -1) as DECIMAL DESC, 
CAST(SUBSTRING_INDEX(version, '.', -1) as DECIMAL) DESC; 

Check Fiddle

+0

謝謝你的工作很好,爲小提琴+1。只是想知道在那裏有3個角色會有什麼缺點(主要是執行時間) - 在現代系統中處理能力可能是一個巨大的問題? – crazyloonybin

+0

是的,首先*你可以將它縮減爲兩招。第二*不排序在表中,如果你使用PHP然後有一個函數** natsort **然後可以爲你做同樣的事情,並且每種語言都有這種類型的功能。 – developerCK

+0

非常感謝您的提示,將看看它:) – crazyloonybin

0

不ORDER BY版本,但:

提取物數量,直到這樣的句號,並以通過第一號,第二和第三

ORDER BY firstVersionNumber, secondVersionNumber, thirdVersionNumber. 

要提取號碼使用字符串函數

1
select * from Table1 
order by CAST(version AS DECIMAL) DESC; 

fiddle

+1

如果一個值17.4.1被添加到你的sql小提琴中,它將不會工作。檢查 – developerCK

+0

這給出了與我的問題與'版本+ 0'所示相同的輸出 - 在1.7.1之前顯示1.7.0。 – crazyloonybin

1

SELECT * FROM Table1 ORDER BY inet_aton(version);

+0

作品像魅力謝謝! inet_aton部分實際上做了什麼?在計算上比使用melc和developerCK提到的模型更好用嗎? – crazyloonybin

+0

inet_aton函數完全按照手冊中的描述工作;-)。基本上,它在整數和互聯網地址之間轉換。互聯網地址恰好是以256點間隔寫入的,所以只要版本符合格式'255.255.255.255',你應該沒問題。 – Strawberry

+0

哈哈我以爲我會得到這樣的迴應,所以也簡單地檢查了一下);它不是以適當的IPv4格式,即我有x.x.x而不是x.x.x.x的事實不會造成問題嗎?另外,我猜測如果它們的格式不一樣,會導致問題,例如將1.1.1和1.2打破排序,它將不得不1.2.0而不是? – crazyloonybin

1
SELECT VERSION, 
CAST(SUBSTRING_INDEX(VERSION,'.',1) AS UNSIGNED) v1, 
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION,'.',2),'.',-1) AS UNSIGNED) v2, 
CAST(SUBSTRING_INDEX(VERSION,'.',-1) AS UNSIGNED) v3 
FROM UPDATES 
ORDER BY v1 DESC, v2 DESC, v3 DESC 
+0

只是個人喜好,但數據是作爲3個單獨的部分給出,這意味着更多的工作將其重新組合在一起輸出,而developerCK的內嵌'DESC'的解決方案將其輸出爲一體。感謝您的答案,但:) +1 – crazyloonybin