2015-04-09 3 views
1

Моя таблица:Как найти нерегулярные increasements на MySql

id   value 
1   25 
2   96 
5   47 
6   41 
9   78 
10   23 

Как найти нерегулярные increasements (или не существования строк), как следующее:

Результат: 3, 4, 7, 8

Я не хочу читать каждый из-за наличия 50 тыс. Строк. Что вы предлагаете мне делать?

+0

Зачем вам это нужно? – Jens

+0

@Jens Мне нужно каждый день проверять отсутствующие данные, и я должен их найти и сохранить в db. – Bora

+0

Одна вещь, которую я могу предложить, - это сгенерировать последовательность и выполнить внешнее соединение с вашей таблицей. Недопустимые значения будут иметь * null *, который указывает ваш недостающий ID. –

ответ

0

Простой подход

Ингредиенты:

  • Генератор стол
  • внешнее соединение

SQL Fiddle

MySQL 5.6 Схема установки:

create table t (id int, value int); 
insert into t values (1, 12); 
insert into t values (3, 12); 
insert into t values (7, 12); 
insert into t values (9, 12); 

Запрос 1:

select generator.row 
from t right outer join 
( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
    (SELECT @row:=0) t5 
) generator 
on generator.row = t.id 
where t.id is null and generator.row < (select max(t.id) from t) 

Results:

| row | 
|-----| 
| 2 | 
| 4 | 
| 5 | 
| 6 | 
| 8 | 

Комплексный подход

Если вам нужны ваши ограничения зазора, вы нужны ингредиенты:

  • MySQL Переменные
  • Generator table по крайней мере вашего максимального ид

Here your query

MySQL 5.6 Настройка схемы:

create table t (id int, value int); 
insert into t values (1, 12); 
insert into t values (3, 12); 
insert into t values (7, 12); 
insert into t values (9, 12); 

дие чень:

select generator.row, rFrom, rTo 
from (
    SELECT @r := @r + 1 as r, 
     case 
      when @r < t.id then @r 
      else Null 
     end as rFrom, 
     case 
      when @r < t.id then t.id - 1 
      else Null 
     end as rTo, 
     @r := t.id 
    FROM t , (SELECT @r:=0) r 
) gaps inner join 
( 
    SELECT @row := @row + 1 as row FROM 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
    (SELECT @row:=0) t5 
) generator 
on generator.row between gaps.rFrom and gaps.rTo 
where rFrom is not null 

Results:

| row | rFrom | rTo | 
|-----|-------|-----| 
| 2 |  2 | 2 | 
| 4 |  4 | 6 | 
| 5 |  4 | 6 | 
| 6 |  4 | 6 | 
| 8 |  8 | 8 | 

Первый подзапрос ищет пробелы интервалов, второй один генератор для выработки недостающих идентификаторов. Будьте готовы выполнять оба запроса один за другим, чтобы понять это.