Форум: "Базы";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
Внизвыборка случайных неповтоярющихся значиений из базы данных Найти похожие ветки
← →
Flok (2007-12-12 09:08) [0]Добрый день уважаемые мастера
У меня возник интресный вопрос ..
может кто поделиться своими соображаниями ?
Есть база ACCESS ней 100 записей , из них 50 соотвествуют определнным условиям.Работа ведеться через ADO . Запросы выполняет ADOQuery .
Как модифицировать текст запроса что бы он выбирал только 10 случайных , не повторяющихся записей (а условию отбора соответсввует 50 вопросов ) .
Заранее спасибо ..
← →
Johnmen © (2007-12-12 09:11) [1]Сгенерить 10 случайных значений уникального идентификатора и отобрать записи, им соответствующие.
← →
Sergey13 © (2007-12-12 09:12) [2]> [0] Flok (12.12.07 09:08)
> не повторяющихся записей
Никогда не повторяющихся?
Работа локальная?
← →
Flok (2007-12-12 09:50) [3]to Johnmen
это база вопросов
есть поле уникальное Номер вопроса в базе
и поле раздел
допустим надо отобрать 5 случайных вопросов 3 го раздела ..
2 вопроса 4 го раздела и так далее ...
тоесть просто сгенировать 10 номер вопросоов а потом из выбрать в базе не получиться
to Sergey13 - работа локальная
ну вообще чем меньше повторений тем лучше ..
← →
Johnmen © (2007-12-12 09:52) [4]Отбираешь ВСЕ вопросы, из их номеров выбираешь случайные, запрашиваешь эти выбранные.
← →
Flok (2007-12-12 10:00) [5]>>Johnmen © (12.12.07 09:52) [4]
Отбираешь ВСЕ вопросы, из их номеров выбираешь случайные, запрашиваешь эти выбранные.
ну я так и сделал юю отобрал все ...
генерирую случайный номер и ищу егов базе но ..
это долго и не эффективно
сначала надо отобрать все впросы ..
потом сгенерировать случайные значения проветить чтобы они не повторялись ..
а ведь наврняка в запросе можноь выбирать случайные вопросы
в инете сть инфа про опретор rnd но заставить его работать .. я не смог
← →
Sergey13 © (2007-12-12 10:06) [6]> [5] Flok (12.12.07 10:00)
> генерирую случайный номер и ищу егов базе но ..
> это долго и не эффективно
В этом случае наверное стоит работать просто с порядковым номером записи в датасете, а не с идентификатором таблицы.
Кроме того желательно сохранять выбранные ранее номера, что бы не повторять их.
← →
Сергей М. © (2007-12-12 10:12) [7]
> в инете сть инфа про опретор rnd
Этот оператор имеет отношение только к MSAccess VBA.
> сначала надо отобрать все впросы
Если в таблице поле перв.ключа содержит заранее известный набор значений (например, записи в этом поле последовательно пронумерованы от 1 до 100), то нет необходимости тянуть на сторону клиента все записи.
← →
Flok (2007-12-12 10:14) [8]сейчас работа ведеться так ..
выбираеться список вопросов ..
загонятеться в датасет
генерируються случайные значения номнера записи в дата сете .. загоняються в массив проверка идет на е совпадения а потом уже едет поик в таблице .. по сохранему значению номера в базе .. прочитанного из номеров сгенерированных значений ...
а мне же интресно модифицировать запрос чтобы получить иненно сразу список случайных вопросов
← →
Johnmen © (2007-12-12 10:17) [9]
> ну я так и сделал юю отобрал все ...генерирую случайный
> номер и ищу егов базе но ..это долго и не эффективно
Ничего подобного. Ты делаешь не так, как я говорил.
Повторю.
Запросом отбирается всё множество идентификаторов, из которых предполагается выбирать случайные неповторяющиеся.
Эти значения имеют порядковый номер в локальном НД. Генерятся случайные числа из диапазона пор.номеров в необходимом количестве. Попутно проверяется неповторяемость сгенеренных номеров.
Запросом отбираются записи с идентификаторами, соответствующими полученным номерам.
← →
Сергей М. © (2007-12-12 10:18) [10]
> Flok (12.12.07 10:14) [8]
Ради всего 10-ти записей из всего 50-ти возможных можно и не менять текущую схему
← →
Flok (2007-12-12 10:29) [11]Сергей М.
Это сейчас всего 50 а в последствии может быть и 100 и 1000 ..
здесь важно , принципиально важно именно модифицировать запрос
← →
Sergey13 © (2007-12-12 10:33) [12]> [8] Flok (12.12.07 10:14)
> а мне же интресно модифицировать запрос чтобы получить иненно
> сразу список случайных вопросов
Я конечто далеко не математик, но, мне кажется, если ты сможешь вывести закон получения неповторяющихся случайностей из произвольного множества, который можно уложить в компьютерный алгоритм, можно и нобелевку огрести.
← →
Сергей М. © (2007-12-12 10:46) [13]
> Flok (12.12.07 10:29) [11]
Тогда наиболее простое и эффективное решение тебе уже предложено в [9]
И одним-единственным запросом в описанных тобой условиях не обойтись.
← →
sniknik © (2007-12-12 10:53) [14]> в инете сть инфа про опретор rnd но заставить его работать .. я не смог
наверное изза ошибки в 17й строке?
> Этот оператор имеет отношение только к MSAccess VBA.
Jet поддерживает практически все из VBA (естественно диалоговые функции не имеются ввиду).
> можно и нобелевку огрести.
а можно ее мне? правда в вопросе отличие там случайные записи из выборки имеются ввиду (что возможно), а ты почемуто о "неповторяющихся случайностях" начал говорить... (без сохранения результатов предыдущих невозможно, или не будут случайными).
← →
sniknik © (2007-12-12 10:59) [15]+ дополнение
"не повторяющихся записей" в вопросе ([0]) я воспринимаю как, неповторяющиеся 10-ть из 50-и (/n) возможны.
"неповторяющиеся случайности" это уже вариант когда первое множество 10-и случайных не пересекаются со вторым из 10-и и т.д. пока все 50-т(/n) не кончатся.
← →
Сергей М. © (2007-12-12 11:03) [16]
> Jet поддерживает практически все из VBA
Может быть. Возражать не буду, ибо никогда не интересовался всеми возможностями jet
← →
Sergey13 © (2007-12-12 11:15) [17]> [14] sniknik © (12.12.07 10:53)
> а можно ее мне?
Я не против.
> правда в вопросе отличие там случайные записи из выборки имеются ввиду
Но в
> [8] Flok (12.12.07 10:14)
он уже захотел просто запросом все сразу готовое получать
← →
flok (2007-12-12 11:16) [18]tO sniknik НеТ ОШИБКА НЕ В 17 строке а пишет .. неверно указаны параметры ...(недостаточное количесво )
да вы правильно понимаете 10 из 50 , причем в этих 10 нет одинаковых
← →
sniknik © (2007-12-12 11:24) [19]> он уже захотел просто запросом все сразу готовое получать
это возможно. и кстати, довольно элементарно.
> tO sniknik НеТ ОШИБКА НЕ В 17 строке а пишет .. неверно указаны параметры ...(недостаточное количесво )
а в чем же еще? семнадцатая и есть.
← →
Sergey13 © (2007-12-12 11:36) [20]> [19] sniknik © (12.12.07 11:24)
> это возможно. и кстати, довольно элементарно.
Ну так раскажи как одним запросом получать каждый раз случайные записи без повторения, интересно же.
← →
Anatoly Podgoretsky © (2007-12-12 11:52) [21]> Flok (12.12.2007 10:00:05) [5]
Чего на 100 записях то, откуда такие тормоза?
← →
Anatoly Podgoretsky © (2007-12-12 12:00) [22]
> Тогда наиболее простое и эффективное решение тебе уже предложено
> в [9]
Если запросить только ИД, и загнать их в StringList, то можно обойти от проверки на повторение.
← →
Anatoly Podgoretsky © (2007-12-12 12:02) [23]
> Ну так раскажи как одним запросом получать каждый раз случайные
> записи без повторения, интересно же.
На слово VBA обратил внимание, язык достаточно продвинутый, что бы справиться с такой простейшей задачей.
← →
Flok (2007-12-12 12:25) [24]Нет дело даже не в 100 записях...
это просто интересная задача одним запросом получать каждый раз случайные записи без повторения
в этой Базе записей 100 .. а если мне в следуюший раз надо будет выбирать из 100 000 случайные значения ?
освоить данную выборку дело принципа
← →
Anatoly Podgoretsky © (2007-12-12 12:33) [25]> Flok (12.12.2007 12:25:24) [24]
Каждый раз без повторения, невозможно, когда твой список кончится, он же не бездонный.
О каких 100 000 если ты не можешь из 100
← →
Flok (2007-12-12 13:11) [26]Anatoly Podgoretsky
Я пишу программу для тестов людей
тоесть я имею в виду что в одном экзамене не должно быть одинаковых вопросов , а если вопрос № Х попадеться в экзамене 1 и 4 допутим человека ,( Люди тестируються Экзаменатором последовательно ... в рамках одного дня экзаменации ) то это не смертельно главное тчобы не было тесте одикаковых вопросов
← →
Sergey13 © (2007-12-12 13:20) [27]> [26] Flok (12.12.07 13:11)
Ну и чем тебе
> [9] Johnmen © (12.12.07 10:17)
не подходит?
Кроме того, на экзаменах обычно (во времена мой молодости по крайней мере) были билеты, которые легко реализовать в программе. Привязку вопросов к билетам можно сделать как статическую, так и динамическую (точнее програмно меняемую). Далее тянуть билет.
← →
Flok (2007-12-12 14:40) [28]нашел решение ...
Для Access можно так:
select top 10 * from voprosi order by rnd(ID)
← →
Anatoly Podgoretsky © (2007-12-12 14:42) [29]> Flok (12.12.2007 14:40:28) [28]
Это ошибочный запрос, не избавляет от дублей.
← →
Flok (2007-12-12 14:45) [30]Ну не знаю у меня все работает ..
нету дублей среди 10 вопросов ...
именно этого я хотле и допиться
← →
sniknik © (2007-12-12 15:05) [31]> Это ошибочный запрос, не избавляет от дублей.
правильный. если вопросы на дублируются сами по себе, дублей не будет.
← →
sniknik © (2007-12-12 15:16) [32]> не избавляет от дублей.
это упрямство или твердость характера? ;о)) мы же уже обсуждали, и вроде как все доказано...
http://delphimaster.net/view/3-1194821423/
← →
Anatoly Podgoretsky © (2007-12-12 15:24) [33]> sniknik (12.12.2007 15:05:31) [31]
Ты хочешь сказать, что повторов в функции RND не будет?
← →
sniknik © (2007-12-12 15:32) [34]> Ты хочешь сказать, что повторов в функции RND не будет?
в функции могут быть, но не в отобранных записях. т.е. дублей не будет, не откуда им там взяться (© > ЮЮ © (13.11.07 12:04) [36]).
← →
Flok (2007-12-12 15:34) [35]В итоге при тексте запроса
select top 55 Qnumber
FROM QUESTIONS
WHERE Inbase=true and razdel=3
order by RND(qnumber)
я получаю последовательность без повторений Qnumber(номер вопроса в базе) , но последовательность постоянно одинаковая ...
может я что то не дописал в запросе ?
← →
ПостОвый терминатор © (2007-12-12 15:36) [36]Учитывая
> допустим надо отобрать 5 случайных вопросов 3 го раздела
> ..
> 2 вопроса 4 го раздела и так далее .
конечно же, [9] Johnmen © (12.12.07 10:17), но мне кажется, что необходимо дополнить:
выбор в цикле по разделам и внутренний цикл по количеству вопросов (не повторяющихся) из каждого раздела
← →
sniknik © (2007-12-12 15:39) [37]> но последовательность постоянно одинаковая ...
значение qnumber должно быть > 0, и это должно быть поле базы, а не параметр/просто число какое нибудь.
в приведенной ветке кстати обьясняется причина.
← →
Flok (2007-12-12 16:06) [38]QNumber "это поле в базе .. оно обозначает номер вопроса в базе
это поле счетчик и оно уникально ..
насчет првиеденной ветки .. там про IB и не факт что Аксесс это все покатит в Аксесс
← →
sniknik © (2007-12-12 17:56) [39]> это поле счетчик и оно уникально ..
правда?... это конечно все обьясняет, раз оно уникально, значит ты ошибок принципиально не делаешь... это же очевидно, как же я раньше об этом не подумал...
а у меня на носу прыщ, и поэтому я гриппом не болею...
> там про IB
и что? логика работы от этого меняется, чтоли? синтаксис тебе не говорили переносить, а говорили посмотреть обьяснения как оно работает, и очень хорошо что там IB, более полно т.к. там еще и саму функцию Rnd пришлось писать.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.067 c