Нужна случайная выборка из базы данных, на данный момент реализовал выборку таким образом : PHP: <?php $random="select id from `tabl`";//выбираю все поля id $res=mysql_query($random); $summ_random = mysql_num_rows($res);//подсчитываю количество полей $id_random = mt_rand(1,$summ_random);//генерируется случайное число от 1 до максимального количества строк в таблице $result_random = mysql_query ("select * from tabl where id=$id_random",$db);//выбираю из таблицы случайную строку $myrow_random = mysql_fetch_assoc($result_random); ?> Вроде бы всё ничего до тех пор пока id идут по порядку, но когда в таблице есть отсутствующие поля начинаются проблемы, например строки 1,2,3,4,5,10,11,15,20,21 получается всего 10 строк и выборка работает в пределах 1 - 10 полей, догадываетесь к чему это приводит? Как ещё можно реализовать рандомную выборку, более менее доступную для новичка, ORDER BY RAND() - не предлагать.
Не знаю, на сколько хороший вариант, но это должно работать. PHP: <?php // ... $sql = "SELECT COUNT(*) FROM `tabl`"; $res = mysql_query($sql, $db) or exit(mysql_error($db)); $rows = (int) mysql_result($res, 0, 0); $row = mt_rand(0, $rows - 1); $sql = "SELECT * FROM `tabl` LIMIT {$row}, 1"; $res = mysql_query($sql, $db) or exit(mysql_error($db)); if(mysql_num_rows($res) > 0) $myrow_random = mysql_fetch_assoc($res); // ... ?>
А почему $row = mt_rand(0, $rows - 1); ?? получается последняя запись не будет участвовать в рандоме ? Не могли бы вы дать комментарии к вашим строкам, буду очень признателен...
Будет участвовать. $rows - 1 потому, что mysql_num_rows() начинает отсчёт с единицы, так сказать. То есть если в б.д. одна строка, mysql_num_rows() вернёт 1, если две - 2 и т.д. LIMIT начинает отсчёт с нуля. Т.е. чтобы получить первую строку нужно написать ... LIMIT 0, 1
будь добр а дай коменты этим строкам $rows = (int) mysql_result($res, 0, 0); и if(mysql_num_rows($res) > 0) $myrow_random = mysql_fetch_assoc($res); ну примерно как я в первом посте делал ...
Эээ... А чё там комментировать-то? Описания всех этих функций в мануале на php.net есть, достаточно открыть и почитать. mysql_result($res, 0, 0) возвращает значение из первой ячейки первой строки (отсчёт начинается с нуля) ответа от сервера mysql. (int) - приведение к целочисленному типу. Можно обойтись и без него, PHP сам по контексту умеет определять, какой тип должен быть у переменной в зависимости от выполняемой над этой переменной операцией. Но я как-то привык задавать нужные мне типы данных вручную и мне так больше нравится. if(mysql_num_rows($res) > 0) $myrow_random = mysql_fetch_assoc($res); Проверяет, есть ли хотя бы одна строка в ответе от MySQL и если да - то записывает её в ассоциативный массив $myrow_random. В принципе, код бы работал и без этой проверки, но если вдруг ответ от б.д. будет пустой - то mysql_fetch_assoc($res) будет приводить к ошибке уровня E_WARNING (кажется).
А вот, я там немного неправильно написал во втором сообщении, вместо Надо читать: $rows - 1 потому, что COUNT(*) начинает отсчёт с единицы, так сказать.