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

Здравствуйте!

Имеется таблица, и нужно выбрать одну случайную запись, удовлетворяющую некоторому условию.

Свой вариант:
1. Считаю кол-во записей для данного условия (SELECT * FROM ... WHERE ...)
2. Выбираю случайную запись. SELECT * FROM `ex4` WHERE ... LIMIT '.rand(0, кол-во ).', 1';

Есть варианты оптимальнее? Спасибо.
  • Вопрос задан
  • 3518 просмотров
Пригласить эксперта
Ответы на вопрос 4
Tyranron
@Tyranron
Если выбрать одну, то вполне можно:
SELECT * FROM `ex4` WHERE %условие% ORDER BY RAND() LIMIT 1

Если нужно несколько, то такой подход не рекомендуется ибо RAND() сильно садит производительность запроса.
Ответ написан
tyzhnenko
@tyzhnenko
System Administrator, DevOps, QA Engineer
Если PK int.

select min(id),max(id) from table where ... ; // если данные меняются не часто можно кешировать значения
$rand = get_rand($min_id, $max_id);
select * from table where id => $rand and ... limit 1;
Ответ написан
@tsisforever
Я бы так и сделал! Создаем колонку id. $query=Выбираем записи mysqli_query Делаем $rand=rand(1,$mysqli_num_rows($query)). Дальше $query=SELECT запрос и дальше fetch_assoc и поперло))
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если id записей достаточно равномерно распределены (нет больших лакун), то можно выбрать max(id), затем первую строку с id большим, чем max(id)*rand(1).
Вместо id можно использовать timestamp записей, беря строку с timestamp большим, чем
min(timestamp)+(max(timestamp)-min(timestamp))*rand(1).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы