Random и Select. КАК?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Random и Select. КАК?

Сообщение Mr Null » 30 янв 2005, 15:11

Надо выбрать n записей из таблицы случаяным образом.
подскажите пожалуйста как это сделать?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 янв 2005, 10:24

так же, случайно... :)

блин, ну чего этот вопрос уже второй или третий раз за две недели вылезает.... Допустим, есть записи. У них должен быть ПК. Для полного счастья ПК делается на генераторе, от 1 до N. Соответственно берем random(n), и получаем случайный идентификатор записи.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 31 янв 2005, 16:09

kdv писал(а):блин, ну чего этот вопрос уже второй или третий раз за две недели вылезает....
И не говори, как будто это можно сделать по другому...

Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Сообщение Mr Null » 01 фев 2005, 12:38

мне надо выбрать не одну запись а например 10
функции random() в документации я не нашёл поэтому и полез на форум.
приведите пожалуйста текст запроса

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 фев 2005, 13:08

mr null. при всем уважении к виртуальному собеседнику, не могу не послать в документацию, в частности к release notes FB 1.0/1.5, где описано first.

функция rand есть в ib_udf. библиотека функций randomudf есть на сервере, в Download/UDF.

Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Сообщение Mr Null » 25 фев 2005, 21:58

Скачал randomudf, делаю:
select SELECT FIRST 10 questions.*, GetRandom(1000) AS Rnd From questions, ругается, работать не хотит... :( :( :(

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 25 фев 2005, 23:32

Mr Null писал(а):Скачал randomudf, делаю:
select SELECT FIRST 10 questions.*, GetRandom(1000) AS Rnd From questions, ругается, работать не хотит... :( :( :(
Край непуганных... а, ладно. Как ругается - козлом или дураком? И так вот прямо и говорит - не хочется чего-то работать, да?

Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Сообщение Mr Null » 28 фев 2005, 12:23

Далею:
select FIRST 10 questions.*, GetRandom(1000) AS Rnd From questions;
Отвечает:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 13.
10.

Изменяю запрос:
select FIRST (10) questions.*, GetRandom(1000) AS Rnd From questions;
Теперь ругается на точку:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 27.
.

McArty
Сообщения: 56
Зарегистрирован: 14 янв 2005, 09:31

Сообщение McArty » 28 фев 2005, 14:45

Mr Null писал(а):Далею:
select FIRST 10 questions.*, GetRandom(1000) AS Rnd From questions;
Отвечает:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 13.
10.

Изменяю запрос:
select FIRST (10) questions.*, GetRandom(1000) AS Rnd From questions;
Теперь ругается на точку:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 27.
.
select First 10 questions.* From questions работает ? (для начала)

DSKalugin
Сообщения: 212
Зарегистрирован: 27 окт 2004, 13:39

Сообщение DSKalugin » 28 фев 2005, 18:34

мндааа.... так questions.* вроде быб не льзя

напиши почеловечески

Код: Выделить всё

select FIRST 10 * From questions
where id=GetRandom(1000);
ты хоть функцию эту GetRandom(1000) задекларировал?
Т.е. выполнял DECLARE EXTERNAL FUNCTION....?

если нет - делай. Иначе опять не будет хотеть работатть

McArty
Сообщения: 56
Зарегистрирован: 14 янв 2005, 09:31

Сообщение McArty » 01 мар 2005, 08:22

DSKalugin писал(а):мндааа.... так questions.* вроде быб не льзя
Попробывать не влом было??? :lol:
а то мужики то не знают,что нельзя. :)

Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Сообщение Mr Null » 04 мар 2005, 12:29

Задекларировать-то задекларировал...
делаю select * From questions where id=GetRandom(1000); ничё не возращает, и ясно почему, у меня в таблице в момент тестирования всего лишь 50 записей, а в процессе работы программы может быть и 500 и 1500 и 3000 и т.д.
Есть ли какой нибудь другой способ решения такой проблеммы?

McArty
Сообщения: 56
Зарегистрирован: 14 янв 2005, 09:31

Сообщение McArty » 04 мар 2005, 14:36

Mr Null писал(а):Задекларировать-то задекларировал...
делаю select * From questions where id=GetRandom(1000); ничё не возращает, и ясно почему, у меня в таблице в момент тестирования всего лишь 50 записей, а в процессе работы программы может быть и 500 и 1500 и 3000 и т.д.
Есть ли какой нибудь другой способ решения такой проблеммы?
ХП придётся наверное, писать, аля
begin
select count(id) from questions into :countQ
for Select ..... from questions where id=GetRandom(:countQ) into ..... do
suspend;
end

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 мар 2005, 15:07

фсе равно фсе это фигня.

автор пытается выбрать случайные 10 номеров из 1000 номеров, при том что у него в базе пока только 50 записей. Потом, автор совершенно не врубается, что random может вернуть один и тот же номер 2 раза (или больше раз).

В общем, автору рекомендую сначала определиться с постановкой задачи, а уже потом приступать к реализации. если речь идет о лотерее, то можно даже на клиенте сгенерить эти 10 значений, с проверкой "уникальности", а потом засунуть их в where id in (1, 5, 15, 32...), потому что на этапе выборки записей думаю, скорость выборки значения иметь не будет.

Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Сообщение Mr Null » 05 мар 2005, 10:02

Задача определена уже как 2 года и софт отлично работает: "Система тестирования студентов", но вот тут вдруг препадам захотелось что б была поддержка так называемых "тем".
Например, в тесте "Уголовный кодекс РФ" есть 180 вопросов, которые разбиты на 10 тем, мне необходимо выбрать по 10 вопросов из каждой темы случайным образом...
Решение всей задачи сводится к точу, что б добавить в таблицу questions ещё одно поле theme_id, создать таблицу themes и не значительно поправить программу...

Rawder
Сообщения: 1
Зарегистрирован: 26 фев 2005, 00:05

Сообщение Rawder » 07 мар 2005, 00:29

Mr Null писал(а):.. что б была поддержка так называемых "тем".
Например, в тесте "Уголовный кодекс РФ" есть 180 вопросов, которые разбиты на 10 тем, мне необходимо выбрать по 10 вопросов из каждой темы случайным образом...
Решение всей задачи сводится к точу, что б добавить в таблицу questions ещё одно поле theme_id, создать таблицу themes и не значительно поправить программу...
Можно попробовать использовать first (1) skip(n) где n - случайное число
полученное в диапазоне (количество вопросов в теме/количество вопросов, которые необходимо показать + значение n из предыдущей итерации). И, соответственно, до цикла проинициализировать n = 0.

В процедуре сделать несложно. Правда распределение будет не очень хорошим.

Mr Null
Сообщения: 11
Зарегистрирован: 21 янв 2005, 20:10

Сообщение Mr Null » 07 мар 2005, 23:44

интересный подход, попробую
спасибо

Pandorin
Сообщения: 2
Зарегистрирован: 29 мар 2005, 17:49

Random и Select. КАК?

Сообщение Pandorin » 29 мар 2005, 18:01

Нужно построить ПК, построить их перестановку с помощью транспозиций(замен местами пар со случайными номерами), дописать к временной табличке (переставленный ПК,Вопрос), отобрать первых 10
У меня проще не получилось
:(

Ответить