(My) SQL: ВЫБЕРИТЕ первое число, не взятое в серии чисел, аналогично MAX () - PullRequest
2 голосов
/ 28 марта 2012

Мне было интересно, есть ли способ ВЫБРАТЬ первое число, которое не берется в серии чисел, подобно тому, как вы используете MAX () для выбора наибольшего числа.

Допустим, у вас естьстолбец "id", и вы вставляете 1,2,3,5,6,8,10, ...

Если вы используете MAX (), он вернет 10. Есть ли способ ВЫБРАТЬ 4 (так как это первый бесплатный номер), заполните 4, а затем ВЫБРАТЬ 7 (5,6 уже занято, поэтому 7 будет следующим ...)

Заранее спасибо!:)

Ответы [ 4 ]

5 голосов
/ 28 марта 2012

Это должно сделать это -

SELECT t1.id + 1
FROM tbl t1
LEFT JOIN tbl t2
    ON t1.id + 1 = t2.id
WHERE t2.id IS NULL
ORDER BY t1.id ASC
LIMIT 1
2 голосов
/ 28 марта 2012

попробуйте этот запрос

SELECT MIN(table0.id)+1 AS newid
FROM tst AS table0
LEFT JOIN tst table1 ON table1.id=table0.id+1
WHERE table1.id IS NULL
1 голос
/ 12 декабря 2016

Вот модификация ответа Додзё. Избегает использования нескольких наборов результатов.

set @i=0;
select max(if(@i=id,@i:=id+1,@i)) from tb1 order by id;

Мне больше нравится этот ответ, потому что он дает мне возможность начать с поиска пропавшего номера.

0 голосов
/ 28 марта 2012

Что вы пытаетесь сделать?Если вы пытаетесь создать уникальный идентификатор для новой строки, которая будет вставлена, то есть лучшие способы сделать это.

Вы можете делать то, что предлагал nnichols, или делать это, если вы не хотите объединений:

set @i=0;
select if(@i=id,@i:=id+1,@i) from tb1 order by id;
select @i;

Очень полезно, если у вас большой стол и вы не хотите объединения.

Примечание. Возвращает несколько наборов результатов.Код вашего приложения должен использовать правильный.Многострочные запросы могут быть отключены по умолчанию из соображений безопасности, вам придется переопределить эти параметры (с осторожностью) в драйвере или конфигурации базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...