На данный вопрос уже ответили:
Как выбрать пропущеные ID?
7 ответов
Представим, что есть некая таблица Users, в которой есть идентификатор (primary key) с именем id. Но по какой-то причине id были вырваны строки. И получилась такая вот таблица:
id 1,2,3,5,6,7,8,10,12
Вопрос, как получить с использованием только одного select набор, который включает только остутствующие числа. То есть какой сделать sql запрос ?
Задали вопрос на собеседовании, стало очень интересно.
Ответ
Если это не диапозон (как в вашем случае), то задача решается очень тривиально и просто. Достаточно сделать подзапрос в WHERE, где нет следующего значения:
SELECT (`numbers`.`number`+1) AS `not_exists_number`
FROM `numbers`
WHERE
(SELECT 1
FROM `numbers` AS `add_table`
WHERE `add_table`.`number` = (`numbers`.`number` + 1)) IS NULL
ORDER BY `numbers`.`number`;
Если действительно нужен один SELECT, то данное решение перепишем на JOIN
SELECT l.number + 1 AS missing
FROM numbers AS l
LEFT JOIN numbers AS r ON l.number + 1 = r.number
WHERE r.number IS NULL;
Правда тут проблема в двух решениях, что последнее значение будет всегда больше последнего в таблице на 1, но его можно отсечь. Если у Вас было последнее 26, то он еще 27 выведет, но за-то очень просто :)
Комментариев нет:
Отправить комментарий