Авторизация







Регистрация / Забыли пароль?

Регистрация нового пользователя











< Назад

Восстановление пароля





< Назад

Добро пожаловать

Выход


Ежедневное обновление статей и уроков, будь в курсе, держи руку на пульсе событий!

Главная >> PHP

Выборка случайных строк из базы данных MySQL


Доброго времени суток Друзья! Сегодня, мы узнаем как делать случайную выборку из MySQL базы данных, 4 простых решения, на ваш выбор.


    Самый простой способ выбора случайных строк из базы данных MySQL это использовать в запросе "ORDER BY RAND()".

Решение 1 [SQL]

SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;

    Решение очень простое, но выполняться будет медленно. Причина этому проста, MySQL при таком запросе создаёт временную таблицу, которая содержит в себе все строки с результатами, при этом каждой из них назначается случайный индекс. Уже после, строки сортируются и возвращаются в виде результата.

    Есть несколько обходных путей для ускорения процесса.

    Основная идея, заключается в том, чтобы получить случайный идентификатор, а затем выбрать определённую строку используя его.

    Мы знаем, что все наши строки имеют уникальный id, а значит, мы можем выбрать число между наименьшим и наибольшим значением, после, из получившегося набора значений, выберем случайное. Чтобы этот метод работал, когда id распределены не равномерно, мы должны использовать ">=" вместо "=" в последнем запросе.

    Для получения минимального и максимального значений id во всей таблице, мы будем использовать агрегатные функции MAX() и MIN(). Эти функции будут возвращать минимальное и максимальное значение в указанной группе. Группа в нашем случае-это все значения `id` столбца, в нашей таблице.

Решение 2 [PHP]

$range_result = mysql_query( " SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` ");
$range_row = mysql_fetch_object( $range_result ); 
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `table` WHERE `id` >= $random LIMIT 0,1 ");

    Данный метод работает когда каждая строка имеет свой уникальный идентификатор, а что делать если его нет?

    Решением для нас будет использование LIMIT. Напомню, данная функция принимает 2 аргумента: 1 – указывает на смещение в первом ряду, иными словами это запись с которой мы начнём; 2 – максимальное количество строк, которые нужно взять с собой в результат. Обращаю ваше внимание, счёт в LIMIT начинается с 0. Пример, LIMIT 0,1 – покажет нам 0 строку, LIMIT 1-5 – покажет с 0 по 4, и т.д.

    Чтобы вычислить смещение первого ряда, мы будем генерировать случайное число между 0 и 1, с помощью функции MySQL RAND() . Затем, умножим это число на количество записей в таблице которое мы получим использую функция COUNT(). Поскольку у LIMIT есть ещё одно ограничение, которое не позволяет нам использовать числа с плавающей запятой, как 1.3 например, то мы будем округлять их с помощью функции FLOOR().FLOOR() работает так, берёт число, например 1.3 и округляет его в меньшую сторону, т.е. будет 1. И наша функция будет выглядеть так:

Решение 3 [PHP]

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );

    В MySQL 4.1 и более поздних версиях, мы можем объединить два предыдущих метода с использованием подзапроса, например так:

Решение 4 [SQL]

SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

    Это решение имеет ту же слабость, что и решение 2, оно работает только для таблиц с уникальным идентификатором.

    Понимаете зачем мы решили использовать альтернативные способы выбора случайных строк? Скорость! Я не собираюсь вдаваться в конкретику о конфигурации аппаратных и программных средств или давать вам точные цифры, но вот результаты которые получил я:

  • Самый медленный метод оказался 1. Скажем, он взял 100% времени на выполнение.
  • Решение 2 взяло 79%.
  • Решение 3 - 13%.
  • Решение 4 - 16%.
  • Победитель решение 3.

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


Дата публикации: 07.02.2013
Опубликовал: Сергей Кашурин
Просмотров: 433
Правила перепечатки

Правила перепечатки

Уважаемый посетитель сайта!
Ниже преведены условия использования и перепечатки материалов сайта /
Все материалы данного сайта подготовлены для Вас лично мной.

Большая часть материалов сайта - это авторские уроки, остальные, это переводы уроков с английского языка на русский.
Если Вы решили использовать материалы данного сайта где-то на своих ресурсах или в рассылке, то соблюдайте следующие требования:
1. Урок или статья должны перепечатываться «как есть» с сохранением всех ссылок на источник урока, а если это перевод, то и на сайт, авторы которого подготовили его.
2. Ссылки на сайт источника и переводчика обязательно должны быть работоспособными (при нажатии по ссылке человек должен перейти на сайт автора/переводчика). Если Вы перепечатали какой-либо документ, обязательно проверьте ссылку на работоспособность.
3. Искажение информации об авторе, источнике, переводчике при перепечатке материалов запрещено!
4. Содержание урока или статьи при перепечатке не должно подвергаться модификациям и переделке. Все уроки и статьи, размещенные на сайте, должны перепечатываться как есть. Вы не имеете права урезать, исправлять или иным образом коверкать републикуемый документ.
С уважением, Сергей Кашурин– владелец сайта /


25 поразительных анимаций CSS3, которые улучшат внешний вид вашего сайта
CSS3, сокращение от английского Cascading Style Sheets 3, третье поколение таблиц стилей, которые используются для визуального представления сайта, при минимальном размере кода. Этот последний многообещающий набор стандартов, состоит из большого числа функций и инструментов, которые позволяют улучшить и контролировать дизайн и увеличивать скорость загрузки сайта.
100 бесплатных PSD элементов для веб-дизайна и мобильных устройств.
Всем привет! Давайте сегодняшний день сделаем исключением, и вместо урока, посмотрим очень классные PSD заготовки для веб-сайтов и мобильных приложений которые вы сможете бесплатно скачать!
5 прекраснейших дизайнерских решений для ваших форм входа
Уважаемые друзья, в этом уроке, собраны 5 красивейших форм регистрации/авторизации, с пошаговым объяснением, и с возможность бесплатно скачать. Вы всё ещё думаете читать или нет? А кто-то уже вовсю пользуется ими!

Уроки и статьи

«Найден Самый Дешевый и Эффективный Способ Рекламы в Интернете!»

Доказанo: ведение своей почтовой рассылки - это самый действенный и дешевый метод рекламы в Интернете.

Используете ли Вы его?

Если нет, то Вы давно теряете свои деньги! Если да, то пришло время вести Вашу почтовую рассылку на самом эффективном инструменте в Рунете - сервисе рассылок SmartResponder.ru

Узнать об этом подробнее >>

Быть в курсе всех событий: