Top.Mail.Ru
Ответы

Как в PHP перейти к определенной записи из результата запроса, и перемешать результаты?

//Запрос вида
$res = mysql_query(SELECT * FROM users");
//нужно перемешать рандомно результат (функция shuffle() не помогает, потому что результат не массив, а ссылка на ресурс
$n = mysql_num_rows($res);
for ($i = 0; $i < $n; $i++) {
$r = mysql_fetch_array($res); //вот это уже массив, но тут шафл неуместен, потому что поменяются местом поля, а надо поменять строки
}
//и вообще, можно ли перемешать шаффлом строки двумерного массива

Дополнен

ORDER BY RAND() функционально идеален, но судя по отзывам, сильно грузит сервер при большой таблице. Будет ли он тормозить по мере увеличения таблицы, если добавить условие, ограничивающее количество записей до 500 максимум?
Например:
SELECT * FROM users WHERE id > 0 AND id < 500 ORDER BY RAND()

По дате
По рейтингу
Аватар пользователя
Просветленный
14лет

$res = mysql_query(SELECT * FROM users ORDER BY RAND()");

Аватар пользователя
Мыслитель
14лет

ORDER BY RAND() работает с уже выбранным записями, поэтому, если предварительно ограничить множество условием типа
WHERE user_id BETWEEN 1 AND 10000
записей в выборку попадёт меньше и рандомизатор отработает быстрее.

Это легко проверить, посмотрев на планы запросов:

EXPLAIN
SELECT * FROM user WHERE user_id BETWEEN 1 AND 1000 ORDER BY RAND()
; -- вес 1`500

EXPLAIN
SELECT * FROM user WHERE user_id BETWEEN 1 AND 100000 ORDER BY RAND()
; -- вес 130`000