Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Вниз

Как выбрать диапазон значений по известным значениям max и min   Найти похожие ветки 

 
tERRORist   (2003-04-27 16:28) [0]

Всем привет. С виду простая задачка поставила меня в тупик. Известны два значения а1 и а2. Как выбрать в один столбец все значения в диапазоне а1 - а2? Мне уже мерещатся темповые таблички, циклы, переменные ... Чувствую есть простое решение, но найти не могу.


 
sniknik   (2003-04-27 17:14) [1]

SELECT * FROM Table WHERE ID BETWEEN а1 AND а2

но только... > известным значениям max и min
это не значения а1 - а2? тогда можно проше -> SELECT * FROM Table
(это в общем, в MySQL может конечно быть варианты с синтаксисом, я с ним мало сталкивался)


 
tERRORist   (2003-04-27 18:31) [2]

Неа, не то. Дело в следующем, пусть есть 2 числа а1=100 и а2=200.
Мне нужно получить набор в столбец, например в А:
А
100
101
102
103
...
200

т.е не из какой-то таблицы, а просто так - все числа между а1 и а2.


 
e-master   (2003-04-27 19:36) [3]

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 19:47) [4]

Ну я в принципе примерно так и думал.
А нельзя ли все сделать на сервере?
Что бы все выполнилось в одной транзакции.
А то на 1000 строк тормозить наверно будет.
Хотя в Мускуле вроде нет циклов ...


 
tERRORist   (2003-04-27 21:48) [5]

Попробовал код предложенный е-мастером.
На локалхосте 1000 записей вставляет 5 секунд.
А мне в макс. случае нужно 3700 и притом на сервере.
Представляю какими словами будут ругаться юзеры,
ожидая результатов где-нибудь минуту...

У кого есть какие-либо соображения, прошу поделиться


 
Johnmen   (2003-04-28 00:00) [6]

Соображение №1 : В MySQL нет транзакций.
№2 : Как указанный набор вообще связан с БД ???
№3 : На хрена ?


 
tERRORist   (2003-04-28 19:13) [7]

Вообщем штука такая: нужно вести учет зарегистрированных читателей в библиотеке универа. На каждом фак-е есть свой отдел библиотеки, где выдают читательские билеты студентам, которые учатся на этом факультете. Каждому отделу сопоставлен свой диапазон номеров читательских. На сервере хранятся все читатели этого отдела. Вот приходит новый чел записываться в этот отдел, а библиотекарю нужно выдать ему билет с незанятым номером.
Вот я и хочу заселектить весь диапазон, а потом из него все что нот ин ... и получится набор незанятых номеров.
А как лучше-то сделать?


 
Arm79   (2003-04-28 20:00) [8]

Можно попытаться так.

1) определяешь записи в промежутке от min до max
2) если приложение, то отправляешь выборку ему. далее ручками определяешь незанятые номера.
если только сервер, то выборку в хранимую процедуру, где в цикле делается тоже самое, что и в приложении. Формируешь результат в виде нового набора данных

А вообще, я бы сделал отдельную таблицу с номерами. Как номер выдают, запись из таблицы удаляется. Оставшиеся легко определяются по Select * from numtables.


 
Arm79   (2003-04-28 20:03) [9]

прошу прощения, Select Num from numtables where Num between min and max.


 
tERRORist   (2003-04-28 20:46) [10]

А как в Мускуле создать хранимую процедуру. На сколько я знаю там их нет. Даже нет циклов. И че разработчики не сделали такую встроенную функцию, вроде распространенная задача...


 
Johnmen   (2003-04-28 22:32) [11]

Если "номер читательский" есть целочисленное поле, то можно запросом получить все "дырки".


 
tERRORist   (2003-04-30 18:47) [12]

Да целочисленное. А как получить одним запросом все дырки? Если можете, приведите пример.


 
Виталий Панасенко   (2003-05-01 00:55) [13]

а не проще ли завести (мне кажется что так и должно быть) таблицу с параметрами по каждому факультету, где одно из полей - последний выданный билет ? При установке говориш: Фак № 1- билет № 0, Фак № 2 - Билет № 200, а потом прирегистрации нового читателя №+1...


 
tERRORist   (2003-05-01 09:23) [14]

Читатели будут выписываться при окончании института или, когда их выгоняют за неуспеваемость. Следовательно будут появляться "дырки" - свободные номера между занятых...


 
kva   (2003-05-01 11:35) [15]

Наверное, проще всего отобрать с сервера уже имеющиеся номера, а на клиенте сгенерить список отсутствующих номеров. Итого один запрос и один цикл.


 
sniknik   (2003-05-01 11:46) [16]

tERRORist © (01.05.03 09:23)
а не удаляй физически, просто обNULLяй какое нибудь поле, это и будет признаком что запись можно использовать повторно.

в таком случае даже есть преимущества, может по выгнанным/уволеным тоже инфаормация понадобится, тогда вообще не удалять, или установить срок "годности" удаленной карточки.

это конечно не по вопросу, по организации базы, по вопросу интересно что Johnmen © (28.04.03 22:32) скажет. (мне например непонятно как, это же не MSSQL где и циклы и функции и т.д.)


 
Oops   (2003-05-01 11:47) [17]

Можно методом подовинного сечения пробовать искать дыру.
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 запросов, а значительно меньше.
Причем если дыр нет то вообще ничего генерить не придется, еще на первом етапе получишь ответ


 
Anatoly Podgoretsky   (2003-05-01 12:59) [18]

tERRORist © (01.05.03 09:23)
Читатели должны выгоняться из института, а не из базы


 
Александр Федоров   (2003-05-05 11:33) [19]

Поиск "дырки":
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
)


 
vopros   (2003-05-05 13:24) [20]

Вообщето в порядочных библиотеках у порядочных библиотекарей в Номере читательского зашифрован Год поступления в том числе. И никаких дыр мскать не надо.


 
MsGuns   (2003-05-05 13:37) [21]

>vopros © (05.05.03 13:24)
Добавлю, что в порядочных универах у каждого скубента есть студ.билет с уникальным номером.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.009 c
14-83685
Supreme 2
2003-05-06 09:05
2003.05.26
Вы верите в Бога?


4-83824
Prooksius
2003-03-31 15:02
2003.05.26
Хэндл другого процесса


1-83524
stkatch
2003-05-13 15:44
2003.05.26
Копирование open array массива в динамический массив


3-83369
RDA
2003-05-04 17:20
2003.05.26
Глюки в цыкле с таблицей


6-83636
Roman
2003-03-26 16:06
2003.05.26
Работа с протоколом nbsession!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский