Главная страница
    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.035 c
6-1081854524
Steelator
2004-04-13 15:08
2004.05.30
Какой лучше использовать Stream для работы с TIdTCPServer/Client


3-1084045511
linx
2004-05-08 23:45
2004.05.30
Как выводить Фамилию Имя Отчество?


3-1083660291
han-bratan
2004-05-04 12:44
2004.05.30
тип данных Мемо


6-1081490934
Orc
2004-04-09 10:08
2004.05.30
Проверить наличие веб-сервера


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