Имеется таблица, и нужно выбрать одну случайную запись, удовлетворяющую некоторому условию.
Свой вариант:
1. Считаю кол-во записей для данного условия (SELECT * FROM ... WHERE ...)
2. Выбираю случайную запись. SELECT * FROM `ex4` WHERE ... LIMIT '.rand(0, кол-во ).', 1';
Тем, что если LIMIT выпадет 93423, то ждать Вы будете ещё дольше, нежели в моём варианте, пока MySQL пролистает все предыдущие 93422 записи и выберет Вашу единственную.
А вот у @tyzhnenko всё выполнится быстро, ибо опирается он на условие по индексному полю.
Не стоит использовать order by rand(). Ибо если вы сделаете explain, то сможете заметить что не используются ключи, а так же используется Using temporary и Using filesort. Использование же where id >= NUM limit 1 будет использовать индекс первичного ключа, что даст огромный прирост производительности. Особенно при использовании InnoDB.
select min(id),max(id) from table where ... ; // если данные меняются не часто можно кешировать значения
$rand = get_rand($min_id, $max_id);
select * from table where id => $rand and ... limit 1;
Я бы так и сделал! Создаем колонку id. $query=Выбираем записи mysqli_query Делаем $rand=rand(1,$mysqli_num_rows($query)). Дальше $query=SELECT запрос и дальше fetch_assoc и поперло))
Для правильного вопроса надо знать половину ответа
Если id записей достаточно равномерно распределены (нет больших лакун), то можно выбрать max(id), затем первую строку с id большим, чем max(id)*rand(1).
Вместо id можно использовать timestamp записей, беря строку с timestamp большим, чем
min(timestamp)+(max(timestamp)-min(timestamp))*rand(1).