Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2010, 15:07   #1
s4shk4
Пользователь
 
Аватар для s4shk4
 
Регистрация: 24.10.2010
Сообщений: 29
По умолчанию Запрос на выборку случайной записи (Delphi, Access)

Прошу помощи по написанию запроса на выборку случайной записи из таблицы.

Способ
SELECT TOP 1 * FROM таблица ORDER BY RND(id);
не подходит. Записи следуют в случайном порядке, но каждый раз одинаково. Может быть вместо RND есть что-либо более эффективное?

Заранее благодарю.
s4shk4 вне форума Ответить с цитированием
Старый 02.11.2010, 15:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

коллега,
1) не соглашусь с Вами!
Удалите TOP 1 и посмотрите. порядок каждый раз разный!

2) поймите, какой бы алгоритм не был предложен, он всё равно не решит Вашу проблему - получать записи без повторов!
А вот то, что я предложил - РЕШИТ!
для этого добавляйте в строковую переменную поочерёдно выпавшие ID-шники
и указывайте их в запросе:
Код:
if sExcludeList<>'' then sExcludeList := sExcludeList + ',';
sExcludeList := sExcludeList + Query1.FieldByName('ID').AsString;
тогда запрос будет:
Код:
if sExcludeList='' then SQL.Text := 'SELECT TOP 1 * FROM таблица ORDER BY RND(id);'
else 
SQL.Text := 'SELECT TOP 1 * FROM таблица WHERE ID NOT IN ('+sExcludeList+
   ') ORDER BY RND(id);'
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.11.2010, 07:13   #3
s4shk4
Пользователь
 
Аватар для s4shk4
 
Регистрация: 24.10.2010
Сообщений: 29
По умолчанию

Спасибо конечно, но не изменилось абсолютно ничего...
*Печалька*
s4shk4 вне форума Ответить с цитированием
Старый 03.11.2010, 08:03   #4
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

а что если
Код:
n := random(Query1.Recordcount);
Query1.First;
For i := 1 to n do
    Query1.Next;
ShowMessage(Query1.Fields[0].asString);
(идем с начала таблицы до записи со случайным номером, затем выводим значения аттрибутов)
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет
pray_driver вне форума Ответить с цитированием
Старый 03.11.2010, 08:15   #5
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
 randomize;
 i:=random(form1.ADOQuery1.RecordCount);
 form1.ADOQuery1.First;
 form1.ADOQuery1.MoveBy(i);
end;
SERG1980 вне форума Ответить с цитированием
Старый 03.11.2010, 08:22   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а что если
Ага. А если там 20 триллионов записей? Представляешь тормоза?
Надежнее получить одну а не все
Код:
with AdoQuery do begin
 sql.text:='SELECT count(*) FROM таблица';  open; Randomize;
 sql.text:='SELECT * FROM таблиц where id='+Random(Fields[0].AsInteger); close;  open;
...
end;
Примерно так, единственное что если ID автоинкрементен могут быть дыры от удалений, это тоже нужно учесть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2010, 08:18   #7
s4shk4
Пользователь
 
Аватар для s4shk4
 
Регистрация: 24.10.2010
Сообщений: 29
По умолчанию

2 pray_driver, SERG1980
Вопросы идут одни и те же.

2 Stilet
Ошибочка вылазит:
Цитата:
List index out of bounds (0)
s4shk4 вне форума Ответить с цитированием
Старый 08.11.2010, 08:23   #8
Cyn4uk
Пользователь
 
Регистрация: 25.11.2007
Сообщений: 56
По умолчанию

А не проще ли узнать сколько всего записей в таблице, далее выкинуть рандом от 1 до кол-ва записей и вытянуть нужную?
Cyn4uk вне форума Ответить с цитированием
Старый 08.11.2010, 08:46   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А не проще ли узнать сколько всего записей в таблице, далее выкинуть рандом от 1 до кол-ва записей и вытянуть нужную?
А я и представил пример,это делающий.
Цитата:
Ошибочка вылазит:
А у меня не вылазит.
Показывай как написал. И строку где вылазит, ато телепатор включать не хочется для такой суперпростейшей задачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2010, 08:49   #10
s4shk4
Пользователь
 
Аватар для s4shk4
 
Регистрация: 24.10.2010
Сообщений: 29
По умолчанию

ololo:=('SELECT * FROM Questions where id='+IntToStr(Random(QueryQuestion. Fields[0].AsInteger))+';');
s4shk4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С# Запрос на выборку fobass Общие вопросы .NET 2 04.02.2010 14:26
Запрос на выборку igordeg Microsoft Office Access 3 21.01.2010 21:33
Запрос на добавление записи в Delphi disaer Помощь студентам 5 09.11.2009 12:07
запрос на выборку МаришаГ Microsoft Office Access 5 21.08.2009 23:46
Запрос на выборку Ruska882009 Microsoft Office Access 2 26.02.2009 20:39