2014-03-06 109 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 。作为解释留下评论的代码。