[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Случайный вывод
Nik_Bar
Ребят такой вопрос, как сделать так, чтобы выводились 6 случайных записей из базы данных. При обновлении страницы эти 6 записей менялись на другие? Кол-во записей допустим 100 или бесконечно.



Спустя 4 минуты, 28 секунд (5.02.2012 - 22:57) johniek_comp написал(а):
$q = mysql_query('SELECT `text` FROM `texts` ORDER BY RAND() LIMIT 1'); 
$r = mysql_fetch_row($q);
echo $r[0];

Спустя 15 минут, 28 секунд (5.02.2012 - 23:13) Nik_Bar написал(а):
johniek_comp , что-то я не понял, объясни пожалуйста. Мне еще как бы надо выводить иконку записи и название.

Спустя 4 минуты, 25 секунд (5.02.2012 - 23:17) johniek_comp написал(а):
$q = mysql_query('SELECT * FROM `tables` ORDER BY RAND() LIMIT 6'); 
$r = mysql_fetch_row($q);
echo $r[0];


вернет случайные записи со всех строк всей таблицы, из первых 6 записей

Спустя 3 минуты, 24 секунды (5.02.2012 - 23:20) Placido написал(а):
Цитата (johniek_comp @ 5.02.2012 - 21:57)
<pre class="sh_sourceCode" rel="php"><span class="sh_variable">$q</span> <span class="sh_symbol">=</span> <span class="sh_function">mysql_query</span><span class="sh_symbol">(</span><span class="sh_string">'SELECT `text` FROM `texts` ORDER BY RAND() LIMIT 1'</span><span class="sh_symbol">);</span> </pre>

С ORDER BY RAND нужно быть предельно осторожным и по возможности такой сортировкой не пользоваться - если записей много, то такой вариант будет работать о-о-о-чень медленно (даже при наличии индексов).
Лучше использовать такой вариант:
SELECT * FROM `table` `t1` JOIN (SELECT FLOOR(MAX(`id`)*RAND()) AS `id` FROM `table`) AS `t2` ON `t1`.`id` >= `t2`.`id` LIMIT 1; 

Спустя 5 минут, 30 секунд (5.02.2012 - 23:26) Каретный написал(а):
Цитата (Placido @ 5.02.2012 - 20:20)
Цитата (johniek_comp @ 5.02.2012 - 21:57)
<pre class="sh_sourceCode" rel="php"><span class="sh_variable">$q</span> <span class="sh_symbol">=</span> <span class="sh_function">mysql_query</span><span class="sh_symbol">(</span><span class="sh_string">'SELECT `text` FROM `texts` ORDER BY RAND() LIMIT 1'</span><span class="sh_symbol">);</span> </pre>

С ORDER BY RAND нужно быть предельно осторожным и по возможности такой сортировкой не пользоваться - если записей много, то такой вариант будет работать о-о-о-чень медленно (даже при наличии индексов).
Лучше использовать такой вариант:
SELECT * FROM `table` `t1` JOIN (SELECT FLOOR(MAX(`id`)*RAND()) AS `id` FROM `table`) AS `t2` ON `t1`.`id` >= `t2`.`id` LIMIT 1; 

Источник? Сам в реальных условиях использовал?

Спустя 2 минуты, 54 секунды (5.02.2012 - 23:29) johniek_comp написал(а):
Placido
запусти запросы, и посмотри чей быстрее будет smile.gif

Спустя 7 минут, 42 секунды (5.02.2012 - 23:36) Каретный написал(а):
Цитата (Nik_Bar @ 5.02.2012 - 19:53)
Ребят такой вопрос, как сделать так, чтобы выводились 6 случайных записей из базы данных. При обновлении страницы эти 6 записей менялись на другие? Кол-во записей допустим 100 или бесконечно.

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

Воюще желательно сразу описывать для чего.

Спустя 13 минут, 26 секунд (5.02.2012 - 23:50) Invis1ble написал(а):
Цитата
Кол-во записей допустим 100 или бесконечно.

ORDER BY RAND() при большом объеме таблицы загнется

Спустя 1 минута, 27 секунд (5.02.2012 - 23:51) Placido написал(а):
Цитата (Каретный @ 5.02.2012 - 22:26)
Источник? Сам в реальных условиях использовал?

Проверял в реальных условиях. Работает быстрее, чем ORDER BY RAND в несколько раз. А источников в Интернете полно - проблема не новая. Например, здесь.
Единственная проблема - такой запрос не подойдет для выборки нескольких случайных записей. А так, да - вариант Johniek_Comp подойдет, если записей не много.

Спустя 1 минута, 2 секунды (5.02.2012 - 23:52) Каретный написал(а):
Цитата (Invis1ble @ 5.02.2012 - 20:50)
Цитата
Кол-во записей допустим 100 или бесконечно.

ORDER BY RAND() при большом объеме таблицы загнется

конкретезируй. что для этого будет большим объемом? колл.записей/частотота запроса.

Спустя 42 секунды (5.02.2012 - 23:53) Invis1ble написал(а):
тут можно подробней почитать
http://hudson.su/2010/09/16/mysql-optimiza...-order-by-rand/

Спустя 9 минут, 5 секунд (6.02.2012 - 00:02) asokol написал(а):
Placido, автору необходима выборка из 6 записей. К тому же приведенный запрос не даст равномерное распределение в случае, если некоторые записи были удалены (то есть имеются пропуск).

При большом количестве записей и наличии пропусков оптимальным методом будет создание поля с непрерывно растущим значением. Правда, при удалении записи $id необходимо обновлять записи c id>$id.

Спустя 1 минута, 6 секунд (6.02.2012 - 00:03) Каретный написал(а):
Цитата (Invis1ble @ 5.02.2012 - 20:53)
тут можно подробней почитать
http://hudson.su/2010/09/16/mysql-optimiza...-order-by-rand/

Вопрос детально не расскрыт, считаю что достаточно будет выдвигаемого варианта.
Будут лаги, тогда можно задуматься о другом решении. зачем оптимизировать то что прежде временно не нуждаеться в этом.
Навороченные варианты не всегда выгодны(возможно даже ущербны) там где не требуються как и простой вариант в хайлоад.

Спустя 3 минуты, 13 секунд (6.02.2012 - 00:07) asokol написал(а):
По указанной ссылке в конце дано ценное замечание, что:
Цитата
Как вы можете видеть, простой ORDER BY RAND() оптимизирован для выполнения при количестве строк не более 100.

Спустя 4 минуты, 19 секунд (6.02.2012 - 00:11) Каретный написал(а):
Цитата

Чтобы получить реальные значения мы провели несколько тестов с числом строк от 100 до миллиона и выполнили каждый запрос 1000 раз.


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

Спустя 11 часов, 37 минут, 52 секунды (6.02.2012 - 11:49) Invis1ble написал(а):
Цитата
По указанной ссылке в конце дано ценное замечание, что:
Цитата
Как вы можете видеть, простой ORDER BY RAND() оптимизирован для выполнения при количестве строк не более 100.

Именно. Сейчас работаю с проектом, где пока что мало записей. Поэтому использую ORDER BY RAND(). Начнутся тормоза - тогда и буду оптимизировать.

Спустя 1 час, 38 минут, 31 секунда (6.02.2012 - 13:27) Nik_Bar написал(а):
asokol, мне не из 6, а вывести 6 записей из 100 допустим и причем случайные.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.