Сведения о вопросе

Gentleman

02:59, 28th August, 2020

Теги

MySQL    

Как выбрать случайную запись из базы MySQL без использования первичного ключа и order by rand()

Просмотров: 420   Ответов: 6

Возникла такая проблема, есть база данных в которой содержатся пользователи (юзеры установившие приложение вконтакте, если быть точным), в качестве Primary key используестся id пользователя в социальной сети, который можно считать случайным числом. Нужно выбрать из базы одного случайного пользователя. Пользователей в базе много поэтому order by rand() использовать слишком накладно, генерировать случайное число и выбирать запись с таким id тоже не получится, учитывая что id идут не по порядку. Как быть в такой ситуации? И заодно, как быть если нужно несколько случайных пользователей?



  Сведения об ответе

lourence

21:06, 1st October, 2020

Первое, что приходит на ум: поиграться с limit, например limit <случайное число>,<размер выборки>


  Сведения об ответе

dumai

23:54, 27th August, 2020

Лучшее решение — брать рандом в диапазоне, в котором лежит первичный ключ — и доставать запись, ключ которой больше или равен этому рандому. Типа такого:

SELECT * FROM my_table
WHERE pk_column >=
(SELECT FLOOR( MAX(pk_column) * RAND()) FROM my_table)
ORDER BY pk_column
LIMIT 1;

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


  Сведения об ответе

piter

21:06, 1st October, 2020

добавьте таблицу вида


  Сведения об ответе

PIRLO

16:46, 27th August, 2020

Денормализовывать id в SET в Redis и использовать SRANDMEMBER.


  Сведения об ответе

park

19:59, 29th August, 2020

заведите поле uRAND в таблице и раз в день сидите туда истинный RAND
после чего SELECT * FROM table WHERE uRAND<somerandvalue ORDER BY uRAND DESC LIMIT 1


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться