![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
случайным образом [D7, IB6.x]
Narayan © (2004-04-30 17:15:00)Есть в таблице 10 записей, к примеру.
Как выбрать из них 4 случайным образом?
narayan (2004-05-03 15:36:00) [1]2 atruhin
Если у тебя большая таблица ты собираешся перед каждой выборкой изменять все записи таблицы, очень нерационально.
Не все.
'UPDATE Voprosi SET RandomValue=RANDOM(100) Where AccessoryToTest=:P0'
Только та часть записей, из которых ЛЮБАЯ может войти в требуемый случайный набор.
Нормально.
1.В процедуре вызывай RANDOM - она показывает сколько записей пропустить относительно последней, или CurrentID:=CurrentID+Random
А если пропущу слишком много и мне записей не хватит?
Да и всего записей может оказаться меньше чем n.
Мне тут говорили можно как-то запрос хитро сформировать, что бы получить конкретное количество записей. Не вкурсе?
atruhin (2004-05-03 13:11:00) [2]>>Как выбрать n первых записей в IB (что-нибудь вроде SELECT TOP...).
В IB только хранимой процедурой организуй в ней счетчик возвращенных записей.
Если у тебя большая таблица ты собираешся перед каждой выборкой изменять все записи таблицы, очень нерационально.
Можно так.
1.В процедуре вызывай RANDOM - она показывает сколько записей пропустить относительно последней, или CurrentID:=CurrentID+Random
и искать следующую - зависит от частного случая.
2.Возвращаешь очередную запись клиенту.
3.Когда вернул нужное кол-во записей запомни последнюю в БД и следующий запрос начинай с неё.
narayan (2004-05-03 07:02:00) [3]..может кому пригодится.
Проблему "случайности" решил следующим образом:
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...).
И можно ли это дело оформить как представление ?
Что посоветуете, мастера ?
kaif (2004-04-30 23:32:00) [4]Если нужно выбирать немного записей (максимум пару десятков), то можно использовать IN:
select ... from ... where id in (1,15,22,30,47)
Текст запроса формировать динамически.
id - первичный ключ типа integer
Reindeer Moss Eater (2004-04-30 17:46:00) [5]SQL ориентирован на запрос с сервера нужных данных, а не случайных. Логично?
Формируй условие where для двух записей, подставляй в него случайные параметры и получай две свои записи
narayan (2004-04-30 17:43:00) [6]А нет такого, что бы в запросе указать навроде "рандомайз" ?
Все записи - это ж лишний трафик.
10 это я для примера написал.
Пускай их будет 50 000, а мне нужно ДВЕ случайные записи.
Кк запросом это зделать?
Reindeer Moss Eater (2004-04-30 17:16:00) [7]выбери все записи.
выбери случайные номера из допустимого диапазона.
встань на эти записи