在MySQL表中排序更新历史记录

时间:2013-10-04 08:50:00

标签: mysql sorting sql-order-by

基本上,我在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.0移到1.7.1之上,因为投放会中断当它到达第二个小数点时,只是按表的顺序输出数据。

有关如何对数据进行排序的任何建议,以便将其显示为:

17.2.1
2.4.2
1.7.1
1.7.0
1.0.0
0.9.8

干杯!

5 个答案:

答案 0 :(得分:1)

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

<强> fiddle

答案 1 :(得分:1)

SELECT * FROM Table1 ORDER BY inet_aton(version);

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

不是ORDER BY版本,但是:

提取数字直到完全停止并按第一个数字,第二个和第三个排序

像这样:

ORDER BY firstVersionNumber, secondVersionNumber, thirdVersionNumber.

提取数字使用字符串函数