我正在寻找一种方法来订购/排序一组定义软件版本的字符串,格式如下:x.x.x(例如:1.3.12)。
这些字符串在数据库(mysql)中,但我不确定这是否相关。
我能想到的一个想法是进行String - >整数(或浮点)转换,然后按整数索引对集合进行排序。但是我不确定这是否可行。
此外,我正在寻找其他想法。
由于
更新:我只考虑设置一个代表我可以实现的最大版本的数字(并且版本我指的是主要版本,次要版本,修订版)。例如我选择数字300,所以最大版本将是299.299.299 所以..当我转换时,我可以这样做:major * pow(300,2)+ minor * pow(300,1)+ revision * pow(300,0)
仍然接受了创意。
答案 0 :(得分:3)
不要使用多字节字符串作为字符串 - 比较它的价值会让你头痛不已
在你的情况下你可以(必须?)将版本扩展为4个八位字节的字符串(尾随0)并使用与IP4相关的函数(来自前端或内置的MySQL)
<强> INET_ATON(表达式)强>
给出IPv4网络地址的虚线四边形表示 string,返回一个表示数字值的整数 网络字节顺序的地址(大端)。 INET_ATON()返回NULL 如果它不理解它的论点。
的MySQL&GT; SELECT INET_ATON('10 .0.5.9'); - &GT; 167773449
对于此示例,返回值计算为10×2563 + 0×2562 + 5×256 + 9。
INET_ATON()可能会也可能不会为短格式IP返回非NULL结果 地址(例如'127.1'代表'127.0.0.1')。 因此,INET_ATON()a不应用于此类地址。
注意:的
要存储INET_ATON()生成的值,请使用INT UNSIGNED列 而不是INT,签名。如果使用带符号的列,则为值 对应于第一个八位字节较大的IP地址 超过127无法正确存储。请参见第10.6节“超出范围 和溢出处理“。
<强> INET_NTOA(表达式)强>
给定网络字节顺序的数字IPv4网络地址,返回 地址的虚线四边形表示为二进制字符串。 如果INET_NTOA()不理解其参数,则返回NULL。
答案 1 :(得分:0)
我只能在没有语言的情况下提供伪代码,但是...在mysql中使用SUBSTRING_INDEX()或在另一种语言中使用类似的函数来使用。作为分隔符。然后使用一组嵌套的if..then条件来比较字符串,如
if(substr1<substr2) return str2;
elseif(subrtr1>substr2) return str1;
elseif(substr1 = substr2)
if(substr1b<substr2b) return str2;
elseif(subrtr1b>substr2b) return str1;
elseif(substr1b = substr2b)
等...
堆是另一种方法。将比较定义为compare()函数。然后添加值并让堆对它们进行排序。
答案 2 :(得分:0)
遇到同样的问题,我最终得到了类似案例的以下解决方案:
select *
from Softwareedition
order by Softwareedition.IsMostRecentVersion DESC,
INET_ATON(
CASE (LENGTH(Softwareedition.VersionNumber) - LENGTH(REPLACE(Softwareedition.VersionNumber, ".", "")))
WHEN 1 then concat(Softwareedition.VersionNumber,".0.0")
WHEN 2 then concat(Softwareedition.VersionNumber,".0")
ELSE Softwareedition.VersionNumber
END) DESC,
Softwareedition.Name DESC
答案 3 :(得分:-3)
您可以将这些值存储为VARCHAR或CHAR,然后只需将ORDER BY ... DESC添加到查询的末尾以获取最新版本,或者取消DESC部分(MySQL默认为ASC)在顶部获得最早的版本
伪代码:
SELECT * FROM Table WHERE xxx ORDER BY Version DESC