как выбрать случайные уникальные записи при каждом выполнении SQL-запроса - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть таблица "masterurls", в которой более 1 миллиона записей. Я хочу получать случайные записи каждый раз, когда выполняется запрос. Он не должен иметь никаких записей, которые были извлечены в предыдущих выполнениях. У меня уже есть этот запрос:

SELECT m.url FROM masterurls ORDER BY RAND() LIMIT 200

Проблема в том, что приведенный выше запрос возвращает только первые 200 сотен записей и каждый раз рандомизирует его.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Поскольку вы можете передать параметр seed в функцию RAND(), вы можете «разбить» на случайные результаты, генерируя seed перед первой страницей.

Пример кода: для первой страницы (зависит отязык):

int seed = Math.abs(new Random().nextInt());

SQL-запрос:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200;

Хранить начальное значение где-то (для веб-приложений вы можете использовать параметр или сеанс URL).Для следующих страниц:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200 * {pageNumber}, 200;

Примечание. Сортировка по RAND() - сложная операция. Возможно, лучше хранить индексированный столбец с хэш-кодом URL-адреса, а затем использовать модуль илидругие случайные функции.

2 голосов
/ 11 февраля 2011

Как вы узнаете, был ли ранее URL-адрес?Мое лучшее предложение было бы установить флаг, чтобы знать это в таблице.Добавьте в таблицу поле типа представления, которое будет принимать два значения: 1 или 0, 1 для уже полученного доступа и 0 для недоступного.Тогда вы могли бы использовать

SELECT m.url FROM masterurls m WHERE view='1' ORDER BY RAND() LIMIT 200;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...