За последние 24 часа нас посетили 31436 программистов и 1764 робота. Сейчас ищут 1056 программистов ...

Случайная выборка из таблицы БД по полю id

Тема в разделе "PHP для новичков", создана пользователем bybad, 1 окт 2011.

  1. bybad

    bybad Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    25
    Симпатии:
    0
    Нужна случайная выборка из базы данных, на данный момент реализовал выборку таким образом :
    PHP:
    1. <?php
    2. $random="select id from `tabl`";//выбираю все поля id
    3. $res=mysql_query($random);
    4. $summ_random = mysql_num_rows($res);//подсчитываю количество полей
    5. $id_random = mt_rand(1,$summ_random);//генерируется случайное число от 1 до максимального количества строк в таблице
    6. $result_random = mysql_query ("select * from tabl where id=$id_random",$db);//выбираю из таблицы случайную строку
    7. $myrow_random = mysql_fetch_assoc($result_random);
    8. ?>
    Вроде бы всё ничего до тех пор пока id идут по порядку, но когда в таблице есть отсутствующие поля начинаются проблемы, например строки 1,2,3,4,5,10,11,15,20,21 получается всего 10 строк и выборка работает в пределах 1 - 10 полей, догадываетесь к чему это приводит?

    Как ещё можно реализовать рандомную выборку, более менее доступную для новичка, ORDER BY RAND() - не предлагать.
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  3. bybad

    bybad Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    25
    Симпатии:
    0
    А почему $row = mt_rand(0, $rows - 1); ?? получается последняя запись не будет участвовать в рандоме ?
    Не могли бы вы дать комментарии к вашим строкам, буду очень признателен...
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Будет участвовать.
    $rows - 1 потому, что mysql_num_rows() начинает отсчёт с единицы, так сказать. То есть если в б.д. одна строка, mysql_num_rows() вернёт 1, если две - 2 и т.д. LIMIT начинает отсчёт с нуля. Т.е. чтобы получить первую строку нужно написать ... LIMIT 0, 1
     
  5. bybad

    bybad Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    25
    Симпатии:
    0
    будь добр а дай коменты этим строкам

    $rows = (int) mysql_result($res, 0, 0);
    и
    if(mysql_num_rows($res) > 0)
    $myrow_random = mysql_fetch_assoc($res);

    ну примерно как я в первом посте делал ...
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Эээ... А чё там комментировать-то? Описания всех этих функций в мануале на 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 (кажется).
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А вот, я там немного неправильно написал во втором сообщении, вместо
    Надо читать:
    $rows - 1 потому, что COUNT(*) начинает отсчёт с единицы, так сказать.
     
  8. bybad

    bybad Активный пользователь

    С нами с:
    31 июл 2011
    Сообщения:
    25
    Симпатии:
    0
    спасибо, что уделил мне время, ща кое что тут доделаю и буду пробовать ...