SQL查询以查找下一个版本号

时间:2013-02-15 16:20:34

标签: mysql sql

我在远程服务器上有一个表,用于存储客户端软件的版本号。我使用SOAP来处理请求。客户端软件发送版本号,我需要使用SQL来查找下一个版本号。

这是我使用的SQL。我脑部有点不好,我知道这不正确,但我似乎无法弄明白我需要做什么。

创建表代码:

CREATE TABLE IF NOT EXISTS `sqlUpdateVersions` (
  `primary_key` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `comment` text NOT NULL,
  `majorVS` tinyint(4) NOT NULL,
  `minorVS` tinyint(4) NOT NULL,
  `revisionVS` tinyint(4) NOT NULL,
  `buildVS` tinyint(4) NOT NULL,
  `filePK` int(11) NOT NULL,
  `customDBJarPK` int(11) DEFAULT NULL,
  PRIMARY KEY (`primary_key`),
  KEY `filePK` (`filePK`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

这是查找版本号的SQL查询。我倾倒在这个版本1.1.0.0

select b.majorVS, b.minorVS,b.revisionVS, b.buildVS
 from sqlUpdateVersions b  where
 b.majorVS>=1 AND b.minorVS >=1 AND b.revisionVS>=0 AND b.buildVS>=10 
 ORDER BY b.majorVS,b.minorVS,b.revisionVS, b.buildVS

现在很明显我可以说这个SQL有问题。但是我如何构造一个能够返回下一个值的东西,比如1.2.0.0或1.1.1.0

感谢。

1 个答案:

答案 0 :(得分:2)

这是一种蛮力方法:

select suv.*
from sqlUpdateVersions suv
where suv.majorVS > 1 or
      (suv.MajorVs = 1 and suv.minorVS > 1) or
      (suv.MajorVS = 1 and suv.minorVS = 1 and suv.revisionVS > 0) or
      (suv.MajorVS = 1 and suv.minorVS = 1 and suv.revisionVS = 0 and suv.buildVS > 10)
order by suv.MajorVS, suv.MinorVS, suv.revisionVS, suv.buildVS

您还可以将版本转换为bigint并直接进行比较:

select suv.*
from (select suv.*,
             buildVS + (cast(1000 as bigint)*revisionVS +
                        (cast(1000 as bigint)*minorVS +
                         (cast(1000 as bigint)*majorVS
                         )
                        )
                       ) as bigVersion 
      from sqlUpdateVersions suv
     ) suv
 where bigversion > 1001000010