Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Вопрос по составлению sql запроса.
цитата
03/04/08 в 17:36
 Lamagro
В базу mysql забиты урлы сайтов.
Можно ли составить запрос таким образом что бы из 100 имеющихся выбрать скажем 5 случайным образом?
Код:
$sites = mysql_query("SELECT * FROM sites");
цитата
03/04/08 в 17:40
 netzoner
Можно. Используя Limit и Rand. Но не советую так делать, так как Rand уж очень сильно грузит мускуль. Особенно при больших таблицах. Поэтому лучше выбирать случайно через php.

SELECT `url` FROM `urls` ORDER BY RAND LIMIT 5
цитата
03/04/08 в 17:41
 netzoner
Для php:
array_rand — Выбрать одно или несколько случайных значений из массива
цитата
03/04/08 в 17:43
 Lamagro
для пхп всмысле выгрузить результат в массив и уже потом рэндомно выдергивать? какой то кривой вариант

п.с. а вообще наверное так и сделаю, вначале получу айдишники записей в массив, а потом уже выдернув случайные номера сделаю новый запрос

биг сэнкс за помощь
smail44.gif

Последний раз редактировалось: Lamagro (03/04/08 в 17:50), всего редактировалось 1 раз
цитата
03/04/08 в 17:49
 netzoner
Lamagro писал:
для пхп всмысле выгрузить результат в массив и уже потом рэндомно выдергивать? какой то кривой вариант


Кривой - но будет работать быстрее на больших таблицах. А вообще кто мешает попробовать оба? ;)
цитата
03/04/08 в 17:50
 ivango
select sites.*,rand() as ordf from sites order by ordf limit 0,5
цитата
03/04/08 в 17:55
 _s_[sov]
netzoner писал:
Для php:
array_rand — Выбрать одно или несколько случайных значений из массива

в таком случае нужно вносить в массив все значения из базы, а это может оказатся не очень при больших объемах.
цитата
03/04/08 в 17:55
 Lamagro
ivango писал:
select sites.*,rand() as ordf from sites order by ordf limit 0,5
smail10.gif неврубился
цитата
03/04/08 в 17:57
 Lamagro
_s_[sov] писал:
в таком случае нужно вносить в массив все значения из базы, а это может оказатся не очень при больших объемах.
потому он кривым и кажется
цитата
03/04/08 в 17:59
 ivango
Lamagro писал:
smail10.gif неврубился


чего не врубился?
Это запрос, который выдает из таблицы sites 5 записей случайным образом... я его проверил, работает.
цитата
03/04/08 в 18:04
 Lamagro
ivango писал:
чего не врубился?
Это запрос, который выдает из таблицы sites 5 записей случайным образом... я его проверил, работает.

у меня тоже работает icon_smile.gif
а что не врубился - опыта маловато - сижу с синтаксисом разбираюсь
цитата
03/04/08 в 18:06
 Lamagro
да кстати - спасибо за помощь icon_smile.gif
цитата
03/04/08 в 19:15
 Corex
На заметку, добавлю - ORDER BY RAND довольно ресурсоёмкий уже при сравнительно небольшом кол-ве записей, а также при большом кол-ве соединений.
C другой стороны, при тех же показателях (кол-во записей и запросов) целый лишний запрос + засор памяти (кучей IDшников) тож не лучший вариант.
В идеале можно сделать, чтобы ID всех сайтов хранилось в переменной в виде массива, периодически обновляясь, а оттуда уже через array_rand выбирались ID, потом запрос к базе через WHERE ID IN (1,23,435,21,9).

Правда, это всё проблемы больших объёмов и нагрузок, а так оба первых варианта хороши, только с ORDER BY RAND мороки меньше.
цитата
03/04/08 в 20:10
 Gourad
Код:

$maxid=mysql_fetch_field(mysql_query('select max(id) as maxid from sites'));
for($i=0;$i<=4;$i++) {
$siteid[]=rand(1,$maxid)
}
$ids=implode(',',$siteid);
$result=mysql_query("select * from sites where id IN ($ids)"));


так пооптимальней будет если нету пропусков в таблице.
цитата
03/04/08 в 22:36
 Cibtor
Lamagro писал:
п.с. а вообще наверное так и сделаю, вначале получу айдишники записей в массив, а потом уже выдернув случайные номера сделаю новый запрос
Самый оптимальный вариант.
цитата
04/04/08 в 00:12
 Gourad
Это с каких пор дергать сто строк стало оптимальнее чем одну max по primary ключу? smail10.gif
цитата
04/04/08 в 06:05
 Lamagro
Gourad писал:
так пооптимальней будет если нету пропусков в таблице.
В том то и дело что пропуски есть, с базой работают - что то удаляют что то добавляют и таким образом запросто можно нарваться на несуществующий элемент. А в массив делать всетаки не очень хотелось бы... количество записей в таблице будет увеличиваться, а выбирать нужно примерно постоянное число
цитата
04/04/08 в 13:10
 Gourad
Lamagro писал:
А в массив делать всетаки не очень хотелось бы... количество записей в таблице будет увеличиваться, а выбирать нужно примерно постоянное число

Как вариант, сделай дополнительный индекс без пропусков, и перестраивай при удалении по триггеру AFTER DELETE. Конешно это не совсем правильно с точки зрения нормализации, но лучше чем выдирать 100К записей в массив который потом сортировать.
цитата
06/04/08 в 06:27
 Lamagro
пока сделал через массив - увеличится нагрузка - буду думать
спасибо за помощь
smail44.gif


Эта страница в полной версии