Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли сделать такой запрос? [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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо