Как эффективно выбрать случайную запись из наибольшего N записей (не используя подзапрос) в MySQL? - PullRequest
2 голосов
/ 20 апреля 2010
select .. from (
    Select ... from ... order by weight desc limit N
    ) order by rand() limit 1

Выше необходимо каждый раз создавать временную таблицу, которая неэффективна, поэтому она не подходит.

Как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

Если я правильно понимаю, вам нужна строка Rth из упорядоченного набора результатов, где R - случайное число Если это так, то вам кажется, что вам нужна опция LIMIT с двумя параметрами. Первым параметром может быть случайное число от 1 to N:

SELECT ... order by weight desc limit R,1

У меня не установлен MySQL, поэтому я не могу его протестировать. Так что я не знаю, может ли R использовать RAND () напрямую или его нужно было бы предварительно вычислить.

0 голосов
/ 20 апреля 2010

Вы должны взглянуть на:

http://akinas.com/pages/en/blog/mysql_random_row/

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

SELECT * FROM `table` WHERE id >= (
        SELECT FLOOR( MAX(id) * RAND()) FROM `table` 
    ) ORDER BY id LIMIT 1;
...