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

如何检测MySQL查询中的非连续数字列?,mysql,sql,Mysql,Sql,我可以在脚本中实现这一点,但我知道这在MySQL中一定很容易实现。你知道银行对账单会在数字不符合顺序的支票旁边加上一个小星号吗?这正是我希望能够做到的 假设一个表具有通常的id pkey,但也具有checkno整数。我想返回三列:checkno、id和outoforder,它们将是空白字符串或星号: SELECT t1.checkno, t1.id, outoforder '' FROM table t1 ORDER BY t1.checkno 我将如何修改此SQL来实现这一点?我在考虑一个子

我可以在脚本中实现这一点,但我知道这在MySQL中一定很容易实现。你知道银行对账单会在数字不符合顺序的支票旁边加上一个小星号吗?这正是我希望能够做到的

假设一个表具有通常的id pkey,但也具有checkno整数。我想返回三列:checkno、id和outoforder,它们将是空白字符串或星号:

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

我将如何修改此SQL来实现这一点?我在考虑一个子查询,比如从表t2中选择t2.id,其中t2.checkno=t1.checkno-1,但是在上面抛出了一些MySQL函数。顺便说一句,我在我的实际表上尝试了这种类型的子查询,但是查询永远不会返回。

通过使用这样的变量,也许

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

应具有较差的性能,但它能够处理未由公式中的单个单元no-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)

祝你好运。保留注释代码作为解释。

您基本上需要为查询提供上一行内容的内存。这是可行的,但会让问题变得丑陋。您最好在客户端代码中这样做。类似的东西可能会帮助您实现此目标。sqlfiddle.com一些数据并显示预期结果,我相信您可以通过@user2989408这样的排名来实现mentioned@Niel看看这个。类似的东西可能对你有用。提到的SQLFiddle几乎有效,但当我将order by更改为checkno并在这些数字中插入一个空格时,该空格后面的所有条目都被标记为无序,而不仅仅是第一个空格:选择t1.checkno,t1.id,@curRank:=@curRank+1作为秩,当t1.Checkno=@curRank,然后其他'*'从选项卡t1以无序结束时,选择@curRank:=选择@curRank:=0,按t1.Checkno排序;谢谢田川!干净、易懂,我将其改编为我的表,它创建了与脚本相同的输出。