Авторизация







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

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











< Назад

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





< Назад

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

Выход


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

Главная >> 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
Опубликовал: Сергей Кашурин
Просмотров: 432
Правила перепечатки

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

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

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


arcticModal - простые модальные окна jQuery
В поисках простого плагина для создания модальных окон, я перепробовал кучу вариантов, наткнувшись на arcticModal я остановился. Простота работы, вес самого плагина меня очень порадовали, поэтому поделюсь с вами я именно им, так как сам его проверял.
BARAJA - jQuery плагин создающий великолепные информационные карточки на вашем сайте, экономя драгоценное место
Благодаря этому плагину, элементы могут располагаться как карты в виде стопки, раскладываясь перед нами оригинальным способом. Добавьте к элементам небольшой текст и уникальный рисунок, примените оригинальный эффект преобразования, и ваша страничка преобразится на глазах.
Colorizer: пользователь сам выберет цвет продукта на вашем сайте
Когда вы выбираете машину, или футболку в интернет магазине, хотелось бы вам самим выбрать для неё цвет? Думаю да. В этой статье, я расскажу вам про плагин Colorizer, с помощью которого, для наших дорогих пользователей, мы сможем предоставить возможность выбора цвета продукта в котором он заинтересован, что оставит о нас приятное впечатление и заявку на покупку. jQuery плагин Colorizer - изменим цвет к лучшему.

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

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

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

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

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

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

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