Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1208339540
DFT
2008-04-16 13:52
2008.05.18
DoMouseWheel


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


2-1208591513
worldmen
2008-04-19 11:51
2008.05.18
Создание меню с TActionManager и TActionMainMenuBar


15-1207034636
TUser
2008-04-01 11:23
2008.05.18
Криптография под угрозой !!!


3-1197899757
Андрей Пл
2007-12-17 16:55
2008.05.18
Вопрос по TIBQuery и его свойству Filter





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский