• Вход
• Регистрация
• Забыли пароль?
Случайные записи в Твиттере
Одним SQL запросом выбрать пропуски в последовательности
02 Nov
Добавлено admin
в Задачи MySQL, MySQL
Исходные данные.
Есть таблица с одним столбцом. В столбце представлены цифры в последовательности 1,2,3,4,5,... Также в последовательности есть пропуски между некоторыми цифрами.
Необходимо найти цифры, после которых есть пропуск.
| Есть таблица test: | Надо найти значения a, с которых начинаются пропуски |
|||||||||||
|
|
Решение
Воспользуемся левым внешним объединением 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: | Результат выполнения запроса | ||||||||||||
|
|
Можно еще улучшить выдачу, убрав последнее (максимальное) значение в списке чисел
Если немного модифицировать запрос, так
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: | Результат выполнения запроса | |||||||||||
|
|
- Блог пользователя admin
- 846 просмотров
-


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