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

Вниз

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

 
Narayan ©   (2004-04-30 17:15) [0]

Есть в таблице 10 записей, к примеру.
Как выбрать из них 4 случайным образом?


 
Reindeer Moss Eater ©   (2004-04-30 17:16) [1]

выбери все записи.

выбери случайные номера из допустимого диапазона.

встань на эти записи


 
narayan ©   (2004-04-30 17:43) [2]

А нет такого, что бы в запросе указать навроде "рандомайз" ?
Все записи - это ж лишний трафик.
10 это я для примера написал.
Пускай их будет 50 000, а мне нужно ДВЕ случайные записи.

Кк запросом это зделать?


 
Reindeer Moss Eater ©   (2004-04-30 17:46) [3]

SQL ориентирован на запрос с сервера нужных данных, а не случайных. Логично?

Формируй условие where для двух записей, подставляй в него случайные параметры и получай две свои записи


 
kaif ©   (2004-04-30 23:32) [4]

Если нужно выбирать немного записей (максимум пару десятков), то можно использовать IN:
select ... from ... where id in (1,15,22,30,47)
Текст запроса формировать динамически.
id - первичный ключ типа integer


 
narayan ©   (2004-05-03 07:02) [5]

..может кому пригодится.

Проблему "случайности" решил следующим образом:
1. Создал в таблице дополнительное поле " RandomValue Integer " .

2. Написал DLL:

library TestSystem_udf;

uses System;

function RANDOM_AT(var Range: Integer): Integer; cdecl;
begin
 Randomize;
 Result:=Random(Range);
end;

exports RANDOM_AT;

end.


3. Объявил внешнюю функцию:

declare external function RANDOM
 integer
 returns integer by value
entry_point "RANDOM_AT"
module_name "TestSystem_udf.dll";


Ну и вот. Перед тем как выбирать нужные мне случайные записи делаю:
"UPDATE Voprosi SET RandomValue=RANDOM(100) Where AccessoryToTest=:P0"
(забиваю это поле случайными значениями)

Соответственно сам запрос выглядит так:
"SELECT * FROM Voprosi WHERE AccessoryToTest=:P0 ORDER BY RandomValue";
Тобишь с упорядочиванием по этому полю.

Всё.

Осталось определиться:
Как выбрать n первых записей в IB (что-нибудь вроде SELECT TOP...).
И можно ли это дело оформить как представление ?

Что посоветуете, мастера ?


 
atruhin ©   (2004-05-03 13:11) [6]

>>Как выбрать n первых записей в IB (что-нибудь вроде SELECT TOP...).
В IB только хранимой процедурой организуй в ней счетчик возвращенных записей.
Если у тебя большая таблица ты собираешся перед каждой выборкой изменять все записи таблицы, очень нерационально.
Можно так.
1.В процедуре вызывай RANDOM - она показывает сколько записей пропустить относительно последней, или CurrentID:=CurrentID+Random
и искать следующую - зависит от частного случая.
2.Возвращаешь очередную запись клиенту.
3.Когда вернул нужное кол-во записей запомни последнюю в БД и следующий запрос начинай с неё.


 
narayan ©   (2004-05-03 15:36) [7]

2 atruhin

Если у тебя большая таблица ты собираешся перед каждой выборкой изменять все записи таблицы, очень нерационально.

Не все.
"UPDATE Voprosi SET RandomValue=RANDOM(100) Where AccessoryToTest=:P0"
Только та часть записей, из которых ЛЮБАЯ может войти в требуемый случайный набор.
Нормально.

1.В процедуре вызывай RANDOM - она показывает сколько записей пропустить относительно последней, или CurrentID:=CurrentID+Random

А если пропущу слишком много и мне записей не хватит?
Да и всего записей может оказаться меньше чем n.

Мне тут говорили можно как-то запрос хитро сформировать, что бы получить конкретное количество записей. Не вкурсе?



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
1-1084893344
Alek_1
2004-05-18 19:15
2004.05.30
Запись и считывания масива из файла


3-1084266514
Shura
2004-05-11 13:08
2004.05.30
ADOConnection. Не закрывается соединение с базой данных.


11-1073638302
<Falcon>
2004-01-09 11:51
2004.05.30
Для ТТ шрифтов Font.FontWidht - это значение в пикселах?


11-1073068424
Dentall
2004-01-02 21:33
2004.05.30
Проблема потоков в KOL (Stream2Stream)


11-1073310593
Yura
2004-01-05 16:49
2004.05.30
замена стандартных модулей на Kol