Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.18;
Скачать: CL | DM;

Вниз

выборка случайных неповтоярющихся значиений из базы данных   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.021 c
2-1208591575
IOrist
2008-04-19 11:52
2008.05.18
Триггер в Ms SQL 2005


2-1208605373
lewka-serdceed
2008-04-19 15:42
2008.05.18
Защита от копирования


15-1207208984
@!!ex
2008-04-03 11:49
2008.05.18
Подключение компа к Веге.


3-1197297073
Fregl
2007-12-10 17:31
2008.05.18
Ошибка добавления lookup поля в TADOTable


2-1208719740
worldmen
2008-04-20 23:29
2008.05.18
Загрузить с ini файла в переменную имена всех ключей