Страница 1 из 1
Random и Select. КАК?
Добавлено: 30 янв 2005, 15:11
Mr Null
Надо выбрать n записей из таблицы случаяным образом.
подскажите пожалуйста как это сделать?
Добавлено: 31 янв 2005, 10:24
kdv
так же, случайно...
блин, ну чего этот вопрос уже второй или третий раз за две недели вылезает.... Допустим, есть записи. У них должен быть ПК. Для полного счастья ПК делается на генераторе, от 1 до N. Соответственно берем random(n), и получаем случайный идентификатор записи.
Добавлено: 31 янв 2005, 16:09
Лысый
kdv писал(а):блин, ну чего этот вопрос уже второй или третий раз за две недели вылезает....
И не говори, как будто это можно сделать по другому...
Добавлено: 01 фев 2005, 12:38
Mr Null
мне надо выбрать не одну запись а например 10
функции random() в документации я не нашёл поэтому и полез на форум.
приведите пожалуйста текст запроса
Добавлено: 01 фев 2005, 13:08
kdv
mr null. при всем уважении к виртуальному собеседнику, не могу не послать в документацию, в частности к release notes FB 1.0/1.5, где описано first.
функция rand есть в ib_udf. библиотека функций randomudf есть на сервере, в Download/UDF.
Добавлено: 25 фев 2005, 21:58
Mr Null
Скачал randomudf, делаю:
select SELECT FIRST 10 questions.*, GetRandom(1000) AS Rnd From questions, ругается, работать не хотит...

Добавлено: 25 фев 2005, 23:32
Merlin
Mr Null писал(а):Скачал randomudf, делаю:
select SELECT FIRST 10 questions.*, GetRandom(1000) AS Rnd From questions, ругается, работать не хотит...

Край непуганных... а, ладно. Как ругается - козлом или дураком? И так вот прямо и говорит - не хочется чего-то работать, да?
Добавлено: 28 фев 2005, 12:23
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.
.
Добавлено: 28 фев 2005, 14:45
McArty
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 работает ? (для начала)
Добавлено: 28 фев 2005, 18:34
DSKalugin
мндааа.... так questions.* вроде быб не льзя
напиши почеловечески
Код: Выделить всё
select FIRST 10 * From questions
where id=GetRandom(1000);
ты хоть функцию эту GetRandom(1000) задекларировал?
Т.е. выполнял
DECLARE EXTERNAL FUNCTION....?
если нет - делай. Иначе опять не будет хотеть работатть
Добавлено: 01 мар 2005, 08:22
McArty
DSKalugin писал(а):мндааа.... так questions.* вроде быб не льзя
Попробывать не влом было???
а то мужики то не знают,что нельзя.

Добавлено: 04 мар 2005, 12:29
Mr Null
Задекларировать-то задекларировал...
делаю select * From questions where id=GetRandom(1000); ничё не возращает, и ясно почему, у меня в таблице в момент тестирования всего лишь 50 записей, а в процессе работы программы может быть и 500 и 1500 и 3000 и т.д.
Есть ли какой нибудь другой способ решения такой проблеммы?
Добавлено: 04 мар 2005, 14:36
McArty
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
Добавлено: 04 мар 2005, 15:07
kdv
фсе равно фсе это фигня.
автор пытается выбрать случайные 10 номеров из 1000 номеров, при том что у него в базе пока только 50 записей. Потом, автор совершенно не врубается, что random может вернуть один и тот же номер 2 раза (или больше раз).
В общем, автору рекомендую сначала определиться с постановкой задачи, а уже потом приступать к реализации. если речь идет о лотерее, то можно даже на клиенте сгенерить эти 10 значений, с проверкой "уникальности", а потом засунуть их в where id in (1, 5, 15, 32...), потому что на этапе выборки записей думаю, скорость выборки значения иметь не будет.
Добавлено: 05 мар 2005, 10:02
Mr Null
Задача определена уже как 2 года и софт отлично работает: "Система тестирования студентов", но вот тут вдруг препадам захотелось что б была поддержка так называемых "тем".
Например, в тесте "Уголовный кодекс РФ" есть 180 вопросов, которые разбиты на 10 тем, мне необходимо выбрать по 10 вопросов из каждой темы случайным образом...
Решение всей задачи сводится к точу, что б добавить в таблицу questions ещё одно поле theme_id, создать таблицу themes и не значительно поправить программу...
Добавлено: 07 мар 2005, 00:29
Rawder
Mr Null писал(а):.. что б была поддержка так называемых "тем".
Например, в тесте "Уголовный кодекс РФ" есть 180 вопросов, которые разбиты на 10 тем, мне необходимо выбрать по 10 вопросов из каждой темы случайным образом...
Решение всей задачи сводится к точу, что б добавить в таблицу questions ещё одно поле theme_id, создать таблицу themes и не значительно поправить программу...
Можно попробовать использовать first (1) skip(n) где n - случайное число
полученное в диапазоне (количество вопросов в теме/количество вопросов, которые необходимо показать + значение n из предыдущей итерации). И, соответственно, до цикла проинициализировать n = 0.
В процедуре сделать несложно. Правда распределение будет не очень хорошим.
Добавлено: 07 мар 2005, 23:44
Mr Null
интересный подход, попробую
спасибо
Random и Select. КАК?
Добавлено: 29 мар 2005, 18:01
Pandorin
Нужно построить ПК, построить их перестановку с помощью транспозиций(замен местами пар со случайными номерами), дописать к временной табличке (переставленный ПК,Вопрос), отобрать первых 10
У меня проще не получилось
