![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выбрать диапазон значений по известным значениям max и min [D7, MySQL]
tERRORist © (2003-04-27 16:28:00)Всем привет. С виду простая задачка поставила меня в тупик. Известны два значения а1 и а2. Как выбрать в один столбец все значения в диапазоне а1 - а2? Мне уже мерещатся темповые таблички, циклы, переменные ... Чувствую есть простое решение, но найти не могу.
MsGuns (2003-05-05 13:37:00) [1]>vopros © (05.05.03 13:24)
Добавлю, что в порядочных универах у каждого скубента есть студ.билет с уникальнымномером.
vopros (2003-05-05 13:24:00) [2]Вообщето в порядочных библиотеках у порядочных библиотекарей в Номере читательского зашифрован Год поступления в том числе. И никаких дыр мскать не надо.
Александр Федоров (2003-05-05 11:33:00) [3]Поиск "дырки":
SELECT
MIN( ID ) + 1 AS AVAIL_ID
FROM
TableName T1
WHERE
NOT EXISTS
(
SELECT
T1.ID
FROM
TableName T2
WHERE
T2.ID = T1.ID + 1
)
Anatoly Podgoretsky (2003-05-01 12:59:00) [4]tERRORist © (01.05.03 09:23)
Читатели должны выгоняться из института, а не из базы
Oops (2003-05-01 11:47:00) [5]Можно методом подовинного сечения пробовать искать дыру.
1 2 3 5 (4 пропущено)
1) последнее 5, количество 4, значит есть дыра
2) select count() where ... between 1 and 5/2 (получаем 2)
3) все номера заняты, пробуем between 2+1 and 5 (получаем 2)
4) одна дыра есть. Ищем дальше в етом диапазоне (3..5) так же,
пока не находиш дыру.
В результате получишь не 3700 запросов, а значительно меньше.
Причем если дыр нет то вообще ничего генерить не придется, еще на первом етапе получишь ответ
sniknik (2003-05-01 11:46:00) [6]tERRORist © (01.05.03 09:23)
а не удаляй физически, просто обNULLяй какое нибудь поле, это и будет признаком что запись можно использовать повторно.
в таком случае даже есть преимущества, может по выгнанным/уволеным тоже инфаормация понадобится, тогда вообще не удалять, или установить срок "годности" удаленной карточки.
это конечно не по вопросу, по организации базы, по вопросу интересно что Johnmen © (28.04.03 22:32) скажет. (мне например непонятно как, это же не MSSQL где и циклы и функции и т.д.)
kva (2003-05-01 11:35:00) [7]Наверное, проще всего отобрать с сервера уже имеющиеся номера, а на клиенте сгенерить список отсутствующих номеров. Итого один запрос и один цикл.
tERRORist (2003-05-01 09:23:00) [8]Читатели будут выписываться при окончании института или, когда их выгоняют за неуспеваемость. Следовательно будут появляться "дырки" - свободные номера между занятых...
Виталий Панасенко (2003-05-01 00:55:00) [9]а не проще ли завести (мне кажется что так и должно быть) таблицу с параметрами по каждому факультету, где одно из полей - последний выданный билет ? При установке говориш: Фак № 1- билет № 0, Фак № 2 - Билет № 200, а потом прирегистрации нового читателя №+1...
tERRORist (2003-04-30 18:47:00) [10]Да целочисленное. А как получить одним запросом все дырки? Если можете, приведите пример.
Johnmen (2003-04-28 22:32:00) [11]Если "номер читательский" есть целочисленное поле, то можно запросом получить все "дырки".
tERRORist (2003-04-28 20:46:00) [12]А как в Мускуле создать хранимую процедуру. На сколько я знаю там их нет. Даже нет циклов. И че разработчики не сделали такую встроенную функцию, вроде распространенная задача...
Arm79 (2003-04-28 20:03:00) [13]прошу прощения, Select Num from numtables where Num between min and max.
Arm79 (2003-04-28 20:00:00) [14]Можно попытаться так.
1) определяешь записи в промежутке от min до max
2) если приложение, то отправляешь выборку ему. далее ручками определяешь незанятые номера.
если только сервер, то выборку в хранимую процедуру, где в цикле делается тоже самое, что и в приложении. Формируешь результат в виде нового набора данных
А вообще, я бы сделал отдельную таблицу с номерами. Как номер выдают, запись из таблицы удаляется. Оставшиеся легко определяются по Select * from numtables.
tERRORist (2003-04-28 19:13:00) [15]Вообщем штука такая: нужно вести учет зарегистрированных читателей в библиотеке универа. На каждом фак-е есть свой отдел библиотеки, где выдают читательские билеты студентам, которые учатся на этом факультете. Каждому отделу сопоставлен свой диапазон номеров читательских. На сервере хранятся все читатели этого отдела. Вот приходит новый чел записываться в этот отдел, а библиотекарю нужно выдать ему билет с незанятым номером.
Вот я и хочу заселектить весь диапазон, а потом из него все что нот ин ... и получится набор незанятых номеров.
А как лучше-то сделать?
Johnmen (2003-04-28 00:00:00) [16]Соображение №1 : В MySQL нет транзакций.
№2 : Как указанный набор вообще связан с БД ???
№3 : На хрена ?
tERRORist (2003-04-27 21:48:00) [17]Попробовал код предложенный е-мастером.
На локалхосте 1000 записей вставляет 5 секунд.
А мне в макс. случае нужно 3700 и притом на сервере.
Представляю какими словами будут ругаться юзеры,
ожидая результатов где-нибудь минуту...
У кого есть какие-либо соображения, прошу поделиться
tERRORist (2003-04-27 19:47:00) [18]Ну я в принципе примерно так и думал.
А нельзя ли все сделать на сервере?
Что бы все выполнилось в одной транзакции.
А то на 1000 строк тормозить наверно будет.
Хотя в Мускуле вроде нет циклов ...
e-master (2003-04-27 19:36:00) [19]i:=a1
while i<=a2 do
begin
table.append;
tablecolumn.asinteger:=i;
table.post;
inc(i);
end;
можно через запрос
insert into table (col)
values (i);
tERRORist (2003-04-27 18:31:00) [20]Неа, не то. Дело в следующем, пусть есть 2 числа а1=100 и а2=200.
Мне нужно получить набор в столбец, например в А:
А
100
101
102
103
...
200
т.е не из какой-то таблицы, а просто так - все числа между а1 и а2.