Случайные записи в Твиттере

Одним SQL запросом выбрать пропуски в последовательности

02 Nov в Задачи MySQL, MySQL

Исходные данные.

Есть таблица с одним столбцом. В столбце представлены цифры в последовательности 1,2,3,4,5,... Также в последовательности есть пропуски между некоторыми цифрами.

Необходимо найти цифры, после которых есть пропуск.

Есть таблица test:   Надо найти значения a,
с которых начинаются пропуски
a
1
2
3
5
6
8
 
a
3
6

Решение

Воспользуемся левым внешним объединением LEFT JOIN

 

SELECT t1.a as a1, t2.a 
FROM test as t1 LEFT JOIN test as t2
ON t1.a = t2.a - 1

Получаем результат

a1 a
1 2
2 3
3 NULL
5 6
6 NULL
8 NULL

Теперь остается отфильтровать только те значения, с которых начинается пропуск.

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

SELECT * 
FROM   (
SELECT t1.a as a1, t2.a
FROM test as t1
LEFT JOIN test as t2
ON t1.a = t2.a - 1
) as t3
WHERE t3.a IS NULL

Получаем таблицу

a1 a
3 NULL
6 NULL
8 NULL

Если немного модифицировать запрос, так

SELECT t3.a1 as a  
FROM ( SELECT t1.a as a1, t2.a
FROM test as t1
LEFT JOIN test as t2
ON t1.a = t2.a - 1 ) as t3 WHERE t3.a IS NULL

Получим результат

Исходная таблица test:   Результат выполнения запроса
a
1
2
3
5
6
8
 
a
3
6
8

Можно еще улучшить выдачу, убрав последнее (максимальное) значение в списке чисел

Если немного модифицировать запрос, так

SELECT t3.a1 as a  
FROM ( SELECT t1.a as a1, t2.a
FROM test as t1
LEFT JOIN test as t2
ON t1.a = t2.a - 1 ) as t3 WHERE
t3.a IS NULL
AND
t3.a1 < (SELECT MAX(a) FROM test)

Получим конечный результат

Исходная таблица test:   Результат выполнения запроса
a
1
2
3
5
6
8
 
a
3
6

Комментарии

Аватар пользователя admin

За последние несколько месяцев активно строил зопросы из кучи LEFT JOIN`ов.
Таблицы и разные и сама к себе джоинил. Доходило до 19 таблиц в обратке за один запрос.

Так вот. Вешеуказанный запрос легко преобразовать из ==Запрос из подзапроса== в один нормальный запрос только из LEFT JOIN без подзапросов

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.