|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Victor Wagner 2:5020/400 23 Feb 2002 00:15:41 To : Ruslan Bondarev Subject : Re: выборка случайной записи, учитывая приоритетность -------------------------------------------------------------------------------- Ruslan Bondarev <Ruslan.Bondarev@p37.f327.n463.z2.fidonet.org> wrote: RB> Hello, All! RB> В общем, такой вот дверной косяк: Есть набор записей в БД RB> (mySQL), каждая запись содержит поле "дата". Hужно выбрать RB> случайную запись, но если день месяца в сегодняшней дате и RB> день месяца в поле "дата" совпадают -- такая запись RB> получает более высокий приоритет (1:4, число в знаменателе RB> может быть любым). RB> Как я решил: выборка всех записей -> засовывание RB> приоритетных записей несколько раз (в соотв. с RB> "валентностью" приоритета) -> случайный элемент массива. RB> База небольшая -- порядка 10 тыс. записей. Hо память жалко RB> еще со времен программирования на МК-61, да и способ, на RB> мой взгляд, слегка кривоват. Может быть решение похожей RB> задачи есть у Кнута? Скорее у Селко. Который "SQL for smarties" Впрочем, у Селко будет решение на sql, надо на mSQL, в котором половины нормальных SQL-ных конструкций нема. Этот подход, впрочем, обсуждался в SU.DBMS.SQL не далее как неделю назад. groups.google.com is your friend. Что касается решения на эхотаге, то у Кернигана и Пайка описан алгоритм, позволяющий вытащить из файла случайную строку не зная заранее количества строк в оном файле. Идея простая. Помещаем в буфер первую строку файла, а затем для каждой следующей строки помещаем ее в буфер с вероятностью 1/$. По окончании чтения файла любая из строк имеет равную вероятность оказаться в буфере. Что тут надо умножить на 4 для того чтобы повысить вес некоторых строк - сам догадаешься. Впрочем, по-моему, памяти ты сэкономишь не более чем в двое. Hасколько я помню интерфейсы (C-шные) mSQL, клиентская библиотека при выполнении запроса вытягивает весь результат в память, и только потом отдает его вызвавшей программе -- Где запрещено смеяться, там обычно и плакать нельзя. --- С.Е. Лец --- ifmail v.2.15dev5 * Origin: Free Net of Leninsky,45 (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/151786bc747a2.html, оценка из 5, голосов 10
|