2013-02-15 73 views
1

我在遠程服務器上有一個表,用於存儲我們客戶端軟件的版本號。我使用SOAP來處理請求。客戶端軟件發送一個版本號,我需要使用SQL來查找下一個版本號。用於查找下一個版本號的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

謝謝。

+0

是有序的'timestamp's根據版本號? – 2013-02-15 16:22:57

+0

@MichaelBerkowski他們應該是,但它不是一個保證。理論上他們應該按順序進行,但是並沒有真正的機制來防止這種情況發生,只是希望我們保持秩序。 – kevingreen 2013-02-15 16:23:28

+0

,我想'primary_key'也是如此 - 不能保證它們是按升序排列嗎? – 2013-02-15 16:24:15

回答

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 
+0

我喜歡這兩種方法,第二種似乎更有意義。是否有任何性能差異? – kevingreen 2013-02-15 16:39:27

+1

第一個版本可能更快,因爲它沒有進行數字計算。然而,速度的差異可能根本不明顯。 – 2013-02-15 17:57:12