2014-08-27 2 views
0

У меня есть тест таблицы:MySQL запросы доступных значений

cod double PRI  
nom varchar(100) 
tip varchar(50) 
des varchar(500) 
pre double 

Таблица содержит числовой первичный ключ с именем «треск». Значения треков идут от 1000 до 40000.

Строки можно удалить. F/E:

Наличие трески:

1001 X X X 1.0 
1002 Y Y Y 2.0 
1003 Z Z Z 3.0 
1004 A A A 4.0 
1005 B B B 5.0 

и если 1002 будет удален, есть пропущенное число между 1001 и 1003.

1001 X X X 1.0 
1003 Z Z Z 3.0 
1004 A A A 4.0 
1005 B B B 5.0 

Могу ли я сделать запрос, чтобы получить все эти отсутствующие чисел, поэтому я могу предложить пользователю, какие значения трески бесплатны для регистрации новых строк?

+0

Есть ли конкретная (и хорошая) причина для ограничения стоимости до 40000? Что произойдет, если нет доступных номеров? –

ответ

0

Вы можете использовать это:

SELECt test1.cod - 1 AS missing_cod 
FROM test AS test1 
LEFT JOIN test test2 ON test2.cod = test1.cod - 1 
WHERE test2.cod IS NULL 

это должно работать (я думаю), я не знаю, что произойдет, если вы получили более чем один недостающее число во время

Почему вы используете double с целым значением на столбце cod?

+0

@PatrickQ. , , Так работает 'left join'. –

+0

Да, это не сработает, если есть последовательные недостающие номера. –

1

Я бы предложил другой подход. Если у вас есть таблица, которая ограничена 39000 строк, тогда создайте эту таблицу со всеми строками для начала.

Затем укажите флаг IsAvailable. Вместо того, чтобы удалять записи, вы можете просто обновить флаг:

update test t 
    set IsAvailable = 1 
    where cod = <whatever>; 

Если вы хотите использовать значение, затем установите имеющийся флаг 1.

Затем, вы можете получить первые 10 доступных слотов с использованием что-то вроде:

select cod 
from test 
where IsAvailable = 1 
limit 10; 

Кстати, вы обратитесь к cod как целое по всему вопросу, пока он объявлен как двойной. Я настоятельно рекомендую вам сделать столбец целочисленным значением.

Смежные вопросы