![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли сделать такой запрос? [D6, MySQL]
SergP © (2004-01-09 16:10:00)
Вобщем такая проблема:
Есть таблица с автоинкрементным полем (допустим id). Так вот:
нужно "вытащить" все id начиная с минимального в таблице и кончая максимальным, но причем такие, которых нет в таблице.
Т.е. например в таблице есть:
1,2,3,5,8,9,10,12
То я должен получить:
4,6,7,11
Мож кто знает как написать такой запрос ? И вообще можно ли это сделать с помощью SQL - запроса?
База MySQL
Johnmen (2004-01-10 15:15:00) [1]
>SergP © (09.01.04 18:42)
>Кстати 1000 - это что?
Это просто когда, к примеру, не нужны "дырки" выше 1000.
В общем случае просто убери условие...
SergP (2004-01-09 18:42:00) [2]
> Johnmen © (09.01.04 16:26) [5]
> Всё можно :)
>
> SELECT T.ID+1, MIN(T1.ID)-1, MIN(T1.ID)-T.ID-1
> FROM TABLE1 T
> JOIN TABLE1 T1 ON T.ID<T1.ID
> WHERE T.ID<=1000 AND T1.ID<=1000
> GROUP BY T.ID
> HAVING MIN(T1.ID)-T.ID>1
Кстати 1000 - это что?
А Если у меня в базе будут id большие чем 1000?
К тому же не обязательно запрос должен быть один.
В принципе меня устроит даже если сначала одним запросом определятся макс и мин. а следующим те числа которые мне нужны (если конечно так будет лучше в смысле быстродействия).
Хотя для меня главное чтобы не делать это в цикле перебором, а то ИМХО так будет очень тормознуто...
SergP (2004-01-09 18:31:00) [3]
Вообще мне вариант Johnmen © (09.01.04 16:26) [5]
больше нравится. Но проверить в работе будет возможность только поздно вечером. Так что пока не могу сказать работает или нет.
В любом случае, большое спасибо всем!
А то я уж было думал перебирать это все в цикле...
Academic (2004-01-09 16:46:00) [4]
Сработало!!!
Academic (2004-01-09 16:45:00) [5]
После некоторой коррекции (просто Join не поддерживается),
запрос удалось запустить. Но с 1000 не дает результата. со 100000
выполняется уже 10 мин (MS Access)
Stas (2004-01-09 16:38:00) [6]
Term © (09.01.04 16:31) [6]
токо это извращение помоему
Согласен
Johnmen © (09.01.04 16:26) [5]
придумал получше !
Если это работает, то лучше 100% !
Term (2004-01-09 16:31:00) [7]
> или сделать временную таблицу с полем ID_1 со значениями
> например 0-100, Потом присоеденить ее
из той же оперы
сделать таблицу в которой ID от 0 до max(id) и потом
SELECT * FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table2)
токо это извращение помоему
Johnmen (2004-01-09 16:26:00) [8]
Всё можно :)
SELECT T.ID+1, MIN(T1.ID)-1, MIN(T1.ID)-T.ID-1
FROM TABLE1 T
JOIN TABLE1 T1 ON T.ID<T1.ID
WHERE T.ID<=1000 AND T1.ID<=1000
GROUP BY T.ID
HAVING MIN(T1.ID)-T.ID>1
Получаем промежутки в которых удалены записи.
В первой колонке будет начальный ID промежутка, во второй - конечный.
В третьей количество удаленных записей в промежутке.
SergP (2004-01-09 16:25:00) [9]
> Academic © (09.01.04 16:18) [1]
> одним запросом нельзя. пиши SP, с перебором всех значений
> до
> max(ID)
Это плохо.
А вообще-то это мне нужно не для Дельфи а для PHP (за что и извиняюсь, так как форум по Дельфи).
Но на PHP делать перебор как-то не совсем то что хотелось бы...
Stas (2004-01-09 16:23:00) [10]
или сделать временную таблицу с полем ID_1 со значениями например 0-100, Потом присоеденить ее
select ID_1 from Table1
Left Join Table2 ON Table1.ID_1=Table2.ID
WHERE ID is NUll
Помоему так.
Term (2004-01-09 16:19:00) [11]
Если токо ХП, но их кажется нет в MySQL
Academic (2004-01-09 16:18:00) [12]
одним запросом нельзя. пиши SP, с перебором всех значений до
max(ID)