Спустя 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) | ||
С 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
запусти запросы, и посмотри чей быстрее будет
запусти запросы, и посмотри чей быстрее будет

Спустя 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) | ||
ORDER BY RAND() при большом объеме таблицы загнется |
конкретезируй. что для этого будет большим объемом? колл.записей/частотота запроса.
Спустя 42 секунды (5.02.2012 - 23:53) Invis1ble написал(а):
тут можно подробней почитать
http://hudson.su/2010/09/16/mysql-optimiza...-order-by-rand/
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.
При большом количестве записей и наличии пропусков оптимальным методом будет создание поля с непрерывно растущим значением. Правда, при удалении записи $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 допустим и причем случайные.