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

在MySQL表中排序更新历史记录,mysql,sorting,sql-order-by,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个

基本上,我将我的软件的更新历史记录保存在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

我尝试在查询中按版本+0 DESC放入
ORDER,这确实会将
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

干杯

不是按版本订购,而是:

提取数字直到句号,并按第一个数字、第二个数字和第三个数字排序

像这样:

ORDER BY firstVersionNumber, secondVersionNumber, thirdVersionNumber.

要提取数字,请使用字符串函数,而不是按版本排序,而是:

select * from Table1
order by CAST(version  AS DECIMAL) DESC;
提取数字直到句号,并按第一个数字、第二个数字和第三个数字排序

像这样:

ORDER BY firstVersionNumber, secondVersionNumber, thirdVersionNumber.
要提取数字,请使用字符串函数

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


从表1中选择*按inet\u aton订购(版本)

从表1中选择*按inet_aton订购(版本)

这会有用的

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;

这将起作用

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;


为什么不将该列拆分为3个字段?排序记录要容易得多。这个呢:为什么不将该列分成3个字段?排序记录要容易得多。这一条呢:如果在sql FIDLE中添加一个值17.4.1,它将不起作用。检查该选项是否提供了与我的问题中所示相同的输出,并且
版本+0
-1.7.0显示在1.7.1之前。如果在sql FIDLE中添加了一个值17.4.1,则该选项将不起作用。检查这是否提供了与我的问题中所示的相同的输出,并且
版本+0
-1.7.0显示在1.7.1之前。谢谢,效果很好,+1也用于小提琴。只是想知道有3次强制转换的缺点(主要是执行时间)是什么——这可能是现代系统处理能力的一个大问题吗?是的,首先,你可以通过技巧将其减少为两次强制转换。第二,不要在表中排序,如果你使用的是php,那么有一个函数natsort可以为你做同样的事情,每种语言都有这样的函数类型。谢谢你的工作非常好,+1的小提琴也。只是想知道有3次强制转换的缺点(主要是执行时间)是什么——这可能是现代系统处理能力的一个大问题吗?是的,首先,你可以通过技巧将其减少为两次强制转换。第二,不要在表中排序,如果你使用的是php,那么有一个函数natsort可以为你做同样的事情,每种语言都有这样的函数类型。工作起来很有魅力,谢谢!inet_aton部分实际上是做什么的?在计算上,这比melc和developerCK提到的cast更好吗?inet_aton函数的工作原理与手册中的描述完全相同;-)。基本上,它在整数和互联网地址之间进行转换。互联网地址恰巧是以256为基数,中间有点,所以只要版本符合“255.255.255.255”格式,你就可以了。哈哈,我想我会得到这个回答,所以也简单地检查了一下;)它不是以正确的IPv4格式(即,我使用的是x.x.x而不是x.x.x.x)存在问题吗?另外,我猜如果它们的格式不一样,可能会导致问题,例如,1.1.1和1.2会破坏排序,而它必须是1.2.0吗?好的,很好,只要它存储在表中正确,我可以随时使用php格式化它。谢谢你的帮助!:)很有魅力,谢谢!inet_aton部分实际上是做什么的?在计算上,这比melc和developerCK提到的cast更好吗?inet_aton函数的工作原理与手册中的描述完全相同;-)。基本上,它在整数和互联网地址之间进行转换。互联网地址恰巧是以256为基数,中间有点,所以只要版本符合“255.255.255.255”格式,你就可以了。哈哈,我想我会得到这个回答,所以也简单地检查了一下;)它不是以正确的IPv4格式(即,我使用的是x.x.x而不是x.x.x.x)存在问题吗?另外,我猜如果它们的格式不一样,可能会导致问题,例如,1.1.1和1.2会破坏排序,而它必须是1.2.0吗?好的,很好,只要它存储在表中正确,我可以随时使用php格式化它。谢谢你的帮助!:)这只是个人喜好,但数据是作为3个独立的部分给出的,这意味着需要做更多的工作将其重新组合到一起输出,而developerCK的解决方案使用内联
DESC
将其作为一个整体输出。感谢您的回答:)+1只是个人偏好,但数据作为3个单独的部分给出,这意味着需要做更多的工作将其重新组合到一起输出,而developerCK的解决方案使用内联
DESC
将其作为一个整体输出。谢谢你的回答:)+1