按软件版本排序/排序 - 算法/实现

时间:2011-10-26 00:21:38

标签: mysql database sorting version-control version

我正在寻找一种方法来订购/排序一组定义软件版本的字符串,格式如下:x.x.x(例如:1.3.12)。

这些字符串在数据库(mysql)中,但我不确定这是否相关。

我能想到的一个想法是进行String - >整数(或浮点)转换,然后按整数索引对集合进行排序。但是我不确定这是否可行。

此外,我正在寻找其他想法。

由于

更新:我只考虑设置一个代表我可以实现的最大版本的数字(并且版本我指的是主要版本,次要版本,修订版)。例如我选择数字300,所以最大版本将是299.299.299 所以..当我转换时,我可以这样做:major * pow(300,2)+ minor * pow(300,1)+ revision * pow(300,0)

仍然接受了创意。

4 个答案:

答案 0 :(得分:3)

不要使用多字节字符串作为字符串 - 比较它的价值会让你头痛不已

在你的情况下你可以(必须?)将版本扩展为4个八位字节的字符串(尾随0)并使用与IP4相关的函数(来自前端或内置的MySQL)

来自MySQL manual

  

<强> 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