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
для пхп всмысле выгрузить результат в массив и уже потом рэндомно выдергивать? какой то кривой вариант
п.с. а вообще наверное так и сделаю, вначале получу айдишники записей в массив, а потом уже выдернув случайные номера сделаю новый запрос
биг сэнкс за помощь
Последний раз редактировалось: 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
неврубился
цитата
03/04/08 в 17:57
Lamagro
_s_[sov] писал:
в таком случае нужно вносить в массив все значения из базы, а это может оказатся не очень при больших объемах.
потому он кривым и кажется
цитата
03/04/08 в 17:59
ivango
Lamagro писал:
неврубился
чего не врубился?
Это запрос, который выдает из таблицы sites 5 записей случайным образом... я его проверил, работает.
цитата
03/04/08 в 18:04
Lamagro
ivango писал:
чего не врубился?
Это запрос, который выдает из таблицы sites 5 записей случайным образом... я его проверил, работает.
у меня тоже работает
а что не врубился - опыта маловато - сижу с синтаксисом разбираюсь
цитата
03/04/08 в 18:06
Lamagro
да кстати - спасибо за помощь
цитата
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 ключу?
цитата
04/04/08 в 06:05
Lamagro
Gourad писал:
так пооптимальней будет если нету пропусков в таблице.
В том то и дело что пропуски есть, с базой работают - что то удаляют что то добавляют и таким образом запросто можно нарваться на несуществующий элемент. А в массив делать всетаки не очень хотелось бы... количество записей в таблице будет увеличиваться, а выбирать нужно примерно постоянное число
цитата
04/04/08 в 13:10
Gourad
Lamagro писал:
А в массив делать всетаки не очень хотелось бы... количество записей в таблице будет увеличиваться, а выбирать нужно примерно постоянное число
Как вариант, сделай дополнительный индекс без пропусков, и перестраивай при удалении по триггеру AFTER DELETE. Конешно это не совсем правильно с точки зрения нормализации, но лучше чем выдирать 100К записей в массив который потом сортировать.
цитата
06/04/08 в 06:27
Lamagro
пока сделал через массив - увеличится нагрузка - буду думать
спасибо за помощь
Новая тема
Ответить
Эта страница в полной версии