Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"случайная" сортировка [D5, IB6.x]


Andrey V. ©   (2004-12-10 09:10:00) 

Полскажите как можно случайно замешать результат sql-запроса, каждый запуск запроса должен давать разную сортировку.
Или без промежуточной таблицы не обойтись ?


Ильичев С.А.   (2004-12-10 23:14:00) [1]

У меня была такая задача. Решил следующим образом:

Во-первых нужен генератор случайных чисел коего нет в ib.
Пишем библиотеку с одной функцией.

library TestSystem_udf;

uses System;

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

exports RANDOM_AT;

end.


Кладём её куда следует.

Далее объявляем в базе нашу udf.

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


Затем добавляем к нужной таблице столбец
(назовём его RandomValue)

Нуивот.
Каждый раз перед нашим главным запросом(1) выполняем
подготовительный, вида:
UPDATE TableName SET RandomValue=RANDOM(100)
Это поле заполняется случанными значениями.
Всё.
В запросе(1) заказываем сортировку по полю RandomValue;

Замечу, что каждый раз заполнять случайными значениями
всю таблицу не рационально. Обновлять надо только те записи
которые могут попать в результат запроса(1).
А значит в подготовительном запросе надо указать условие
точно такое же как и в запросе(1).

И, кстати, да. Пора эту тему в FAQ занести.


Val   (2004-12-10 18:06:00) [2]

> [6] Andrey V. ©   (10.12.04 14:22)
нет, конкатенируйте. только это будет сортировка по случайному столбцу - вам это надо?


Andrey V.   (2004-12-10 14:22:00) [3]


> select *
> from your_table
> order by :order_param

А параметр вообще можно ставить в order by
Что-то у меня и программа ругается и IBExpert не принимает подоьную конструкцию...


Виталий Панасенко   (2004-12-10 10:30:00) [4]

А не проще ли (если делаем в программе а не в ISQL) по набору мотаться
Qry.First;
Qry.MoveBy(Random(Qry.RecordCount (или зарание подсчитанное значение)+1) ?


Ditrix   (2004-12-10 10:19:00) [5]

Andrey V. ©   (10.12.04 09:46) [3]
зачем ?
просто перед вызовом пишешь
Query.ParamByName('order_param').AsString = YourRandomFieldName;
потом
Query.Open

или о Delphi речь вообще не идет?


Andrey V.   (2004-12-10 09:46:00) [6]

то есть если я делаю выборку
select *
from table1
where Условие

сначала сделать
Update table1 set Rnd=:GenerateRandom
where Условие

?

ИМХО накладно по скорости может оказаться ...


DenK_vrtz   (2004-12-10 09:19:00) [7]

Данный вопрос становится популярным!
Было неделю(если память не изменяет) назад.
Было предложено такое решение. Выделить под сортировку поле, которое необходимо заполнять случайными числами. Поэтому полю и производить сортировку.


Ditrix   (2004-12-10 09:16:00) [8]

select *
from your_table
order by :order_param


Наверх

Титульная страница Поиск, карта сайта Написать письмо