2014-03-06 110 views
0

我可以在腳本中做到這一點,但我知道這一定很容易在MySQL中。你知道一張銀行對賬單如何在旁邊的數字不合格的支票旁邊加一個星號?這正是我想要做的。如何檢測MySQL查詢中的非連續數字列?

假設一個表與通常的id pkey,但也是一個checkno整數。我想回到三列:checknoidoutoforder這將是一個空字符串或星號:

SELECT t1.checkno, t1.id, outoforder '' FROM table t1 ORDER BY t1.checkno 

我將如何修改這個SQL這樣做呢?我正在考慮像(SELECT t2.id FROM table t2 WHERE t2.checkno = t1.checkno - 1)這樣的子查詢,但在頂部引入了一些MySQL函數。順便說一句,我在我的實際表上嘗試了這種類型的子查詢,查詢只是從不返回。

+0

您基本上需要爲查詢提供前一行中出現內容的「內存」。這是可行的,但使查詢醜陋。你最好在客戶端代碼中完成它。 –

+0

類似[RANKing](http://stackoverflow.com/questions/3333665/mysql-rank-function)可能會幫助您實現此目的。 – user2989408

+0

sqlfiddle.com一些數據和顯示預期的結果,我相信你可以做到像@ user2989408提到的排名 –

回答

1

通過使用這樣的變量也許?

SELECT t1.checkno,t1.id, 
     IF(@lastCheckNo IS NULL OR @lastCheckNo = t1.checkno - 1,'','*') as outoforder, 
     @lastCheckNo := t1.checkno 
FROM (SELECT * FROM `table` ORDER BY checkno) t1,(SELECT @lastCheckNo := NULL)variable 

sqlFiddle

+0

Thanks Tin Tran!乾淨,可以理解,並且我將它適用於我的表格,並創建了與我的腳本相同的輸出。 –

0

應該有表現不佳,但它能夠處理不是由一個單元(式中沒有-1)分隔行ID:

SELECT 
    T.id, T.checkno, 
    /* T1.id AS PREVIOUS_ID, T1.checkno AS PREVIOUS_CHECK, */ 
    /* T2.id AS NEXT_ID, T2.checkno AS NEXT_CHECK, */ 
    CASE 
    WHEN T1.checkno > T.checkno THEN '*' 
    WHEN T2.checkno < T.checkno THEN '*' 
    ELSE '' 
    END AS OUT_OF_ORDER 
FROM Tab T 
    LEFT JOIN Tab T1 ON T1.id = (SELECT MAX(S1.id) FROM Tab S1 WHERE T.id > S1.id) 
    LEFT JOIN Tab T2 ON T2.id = (SELECT MIN(S2.id) FROM Tab S2 WHERE T.id < S2.id) 

有一個fiddle 。作爲解釋留下評論的代碼。