Как выбрать случайные записи, каждый раз разные

Статус
В этой теме нельзя размещать новые ответы.
Решение проблемы случайной выборки из большого количества записей, почему может перестать выполняться такой запрос и решение проблемы можно прочитать Для просмотра ссылки Войди или Зарегистрируйся
 
саймый быстрый способ выбрать случайные записи это просто использовать поле которое содержит случайные числа в диапазоне меньшем чем кол-во записей в таблице, естественно поле индексированное.

для того чтоб выбрать несколько случайных строк необходимо сгенерировать случайное число один раз (в скрипте например ) и выбрать все записи содержащие это число. только единственная проблемма может встать в том что в таблице может быть менее 3х записей тогда остальные надо выуживать другими запросами. как мне кажется то и ORDER BY RAND() во множестве уже выбранных записей будет выполняться быстрее чем на множестве не выбранных по такому числу (хотя надо проверить)

Код:
select * from table1 where rnd=$rnd
, где rnd это поле содержащие случаные числа, а $rnd переменная сгенерированным в скрипте значением. значение как и rnd, так и $rnd необходимо выбирать меньшее чем количество записи по той простой причине, что мы должны с вероятностью стремящейся к единице получить хоть какие-то записи.

а для того чтоб создать новое поле надо просто добавить alter table'ом его и создать на нем индекс затем, можно даже каждый день пересчитывать эти случайные величины по крону:

Код:
update table1 set rnd=rand()*$max_rnd

Добавлено через 8 минут
Решение проблемы случайной выборки из большого количества записей, почему может перестать выполняться такой запрос и решение проблемы можно прочитать Для просмотра ссылки Войди или Зарегистрируйся

да хотя можно было и не городить огород с полем содержащем случайное значение, а использовать эту реализацию... но для того чтоб не получать подряд идущие записи, надо просто в скрипте в цикле вызывать процедуру генерения лимита (например для 3х записей вызвать три раза селект с "limit ".rand(0,$totals-1).",1"), это вполне быстрая операци (у меня на 700 тыс записей 0.2 сек работает такой вызов)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху