mysql检查增加1的列值是否缺少

时间:2013-10-31 07:36:56

标签: mysql missing-data

我有一个列,其中我插入的值加1(该列不是AUTO_INCREMENT)。如何在其中搜索空白,例如专栏:1,2,4,5,6 - 我想选择缺少的3.谢谢!

4 个答案:

答案 0 :(得分:0)

简单案例:只有第一个差距

你可以这样做:

SELECT 
  MIN(seq) 
FROM 
  (SELECT 
     sequence, 
     @seq:=@seq+1 AS seq 
   FROM 
     t CROSS JOIN (SELECT @seq:=0) AS init) AS gap 
WHERE 
  sequence!=seq

- 其中字段sequence指向您的列,您正在寻找差距。见fiddle demo

现在,常见的情况。

你不能只使用JOIN或类似的东西,因为你的桌子的大小可能小于它的可能差距。想象一下这种情况,当你的表只填充最小值和最大值时。例如,110 - 并且您希望获取所有行,因此结果将是序列1, 2, ... , 10。无论你如何JOIN你自己的桌子,你只会得到两排 - 因为你的桌子里只有这两排。 UNION也不是一个选项 - 因为如果我们为10构建100,通常情况下可以是1000MIN(sequence),e t.c。因此,对于常见情况,您必须创建序列表并使用MAX(sequence)SELECT full_table.sequence FROM full_table LEFT JOIN t ON full_table.sequence=t.sequence WHERE t.sequence IS NULL 中的值填充它 - 然后使用LEFT JOIN执行以下操作:

{{1}}

答案 1 :(得分:0)

这就是我用于这些任务的陈述。 id表示您要分析的字段。

SELECT   t1.id+1 AS 'start_seq', 
         MIN(t2.id) - 1 AS 'end_seq'
FROM     yourTable AS t1, 
         yourTable AS t2
WHERE    t1.id < t2.id
GROUP BY t1.id
HAVING   'start_seq' < MIN(t2.id);

虽然这个工作已经完成,但可能会有更好,更紧凑的解决方案。

答案 2 :(得分:0)

试试这个!!

DECLARE @a int
SET @a = SELECT MIN(num) FROM table1
WHILE (SELECT MAX(num) FROM table1 ) > @a
BEGIN
IF @a NOT IN ( SELECT num FROM table1 )
PRINT @a
SET @a=@a+1
END

答案 3 :(得分:0)

您可以尝试这样的事情

SELECT (t1.id + 1) as gap_starts_at, 
       (SELECT MIN(t3.id) -1 FROM your_table t3 WHERE t3.id > t1.id) as gap_ends_at
FROM your_table t1
WHERE NOT EXISTS (SELECT t2.id FROM your_table t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL