如何检测MySQL查询中的非连续数字列?

时间:2014-03-06 21:34:32

标签: mysql sql

我可以在脚本中执行此操作,但我知道这在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函数。顺便说一句,我在我的实际表上尝试了这种类型的子查询,但查询永远不会返回。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

性能不佳,但它能够处理没有被单个单元分隔的行ID(公式中没有-1):

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。将评论的代码留作解释。