Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Выборка случайных значений из БД MySQL

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> Выборка случайных значений из БД MySQL
Имя
Сообщение << Старые топики   Новые топики >>
Выборка случайных значений из БД MySQL - 2008-10-24 20:28:09.726666   
lovop2

Сообщений: 10
Оценки: 0
Присоединился: 2008-10-24 20:26:12.210000
Есть таблица link с полями id, url, title, category, active.
В этой таблице хранится список ссылок на сайты (url), название сайта (title),
категория (category), active (одобрен модератором, тип boolean). id это уникальный идентификатор.
Запрос такой SELECT url, title FROM link WHERE category=foto AND active=true

в PHP есть rand, это я знаю.
После этого запроса скрипт получит список сайтов,
теперь надо выбрать из получившегося списка случайным образом 10 разных сайтов.
Вот как это сделать не знаю, какой SQL-запрос использовать?
Post #: 1
RE: Выборка случайных значений из БД MySQL - 2008-10-24 20:29:42.196666   
lovop2

Сообщений: 10
Оценки: 0
Присоединился: 2008-10-24 20:26:12.210000
"ORDER BY RAND() LIMIT 10"
С запросом LIMIT я знаком, поэтому знаю что это лимит.
Да, идея правильная. Но эта rand может сгенерировать
одинаковые значения, а мне надо разные каждый раз.

Может результат первого запроса добавить с массив (как функция file) и из этого массива
for i=1 to 10 и каждый раз в теле цикла
вызывать rand (0, длина_массива)
и после этого удалять из массива выбранный элемент?
Post #: 2
RE: Выборка случайных значений из БД MySQL - 2008-10-24 20:31:14.743333   
oRb

Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
SELECT `url`, `title` FROM `link` WHERE `category`='foto' AND `active`='true' ORDER BY RAND() LIMIT 10

Выдаст 10 "случайных" записей

UPD:
o_O опередил меня.
quote:

Но эта rand может сгенерировать одинаковые значения, а мне надо разные каждый раз.

там нормальная генерация случайной последовательности.
Post #: 3
RE: Выборка случайных значений из БД MySQL - 2008-12-04 00:42:23.530000   
kenan_bek

Сообщений: 95
Оценки: 0
Присоединился: 2008-06-22 13:42:33.113333
а как выбрать последний элемент из таблицы?
Post #: 4
RE: Выборка случайных значений из БД MySQL - 2012-03-04 23:02:27.310000   
SizeKing

Сообщений: 41
Оценки: 0
Присоединился: 2010-03-03 10:48:33.933333
Для особо одаренных

меняем

$query = "SELECT * FROM `xxx` ORDER BY RAND() LIMIT 0 , 15;";
на
$offset_result = mysql_query("SELECT FLOOR(RAND() * (COUNT(*)-15)) AS `offset` FROM `xxx`;"); $offset_row = mysql_fetch_object($offset_result); $offset = $offset_row-&gt;offset; $query = "SELECT * FROM `xxx` LIMIT $offset, 15;";
потому как эти 2 кода индентичны но нижний работает в сотни раз быстрее

а про
ORDER BY RAND()
нужно забывать - потому как это быдлокод и при табличке размером в 100 000 записей и выше этот код повесит сервер
все дело в том что
ORDER BY RAND()
создает временную таблицу размером с исходной
представляете сколько по времени будет копироваться табличка в 100 000 строк - как минимум 10 секунд - а значит на сайте загрузка страницы будет занимать 15 сек, а если на сайте будет 10 посетителей то сервер нагнется
Post #: 5
RE: Выборка случайных значений из БД MySQL - 2012-03-09 13:56:55.660000   
bob3r

Сообщений: 67
Оценки: 0
Присоединился: 2011-06-03 02:30:17.840000
В Microsoft SQL для рандомизации использовал дополнительную колонку временной таблицы, в которую генерировался GUID, с сортировкой по нему. Как понял с offset и правда будет быстрее, но offset нет в SQL 2000-2008 R2.
Post #: 6
Страниц:  [1]
Все форумы >> [Прочее] >> Выборка случайных значений из БД MySQL







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.