Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.032 c
3-1083898736
Maxim2030
2004-05-07 06:58
2004.05.30
обновление DataSet а не работает...


8-1078420914
miek
2004-03-04 20:21
2004.05.30
DirectDraw: создание поверхностей


1-1084698515
Евгений2
2004-05-16 13:08
2004.05.30
малелький вопрос по DLL


3-1084107044
Cardinal
2004-05-09 16:50
2004.05.30
Присвоение значения полю. Проблема.


11-1072508685
gishu
2003-12-27 10:04
2004.05.30
дата модификации файла





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