blagoy_vip 7 Опубликовано: 10 ноября 2008 Рассказать Опубликовано: 10 ноября 2008 Заказал в dlemods.ru модуль, выкладываю в паблик. 1. В файле index.php: строку: $tpl->copy_template = preg_replace( "#\\{custom category=['\"](.+?)['\"] template=['\"](.+?)['\"] aviable=['\"](.+?)['\"] from=['\"](.+?)['\"] limit=['\"](.+?)['\"] cache=['\"](.+?)['\"]\\}#ies", "custom_print('\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '{$do}')", $tpl->copy_template ); заменить на: $tpl->copy_template = preg_replace( "#\\{custom category=['\"](.+?)['\"] template=['\"](.+?)['\"] aviable=['\"](.+?)['\"] from=['\"](.+?)['\"] limit=['\"](.+?)['\"] cache=['\"](.+?)['\"] random=['\"](.+?)['\"]\\}#ies", "custom_print('\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '\\7', '{$do}')", $tpl->copy_template ); 2. В файле engine/modules/functions.php: 1) строку: function custom_print ($custom_category, $custom_template, $aviable, $custom_from, $custom_limit, $custom_cache, $do) заменить на: function custom_print ($custom_category, $custom_template, $aviable, $custom_from, $custom_limit, $custom_cache, $custom_random, $do) 2) строку: $sql_select = "SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM " . PREFIX . "_post WHERE ".$stop_list.$where_category." AND approve".$where_date." ORDER BY ".$config['news_sort']." ".$config['news_msort']." LIMIT ".$custom_from.",".$custom_limit; заменить на: if($custom_random == "no") $order_by = " ORDER BY ".$config['news_sort']." ".$config['news_msort']; else $order_by = " ORDER BY RAND()"; $sql_select = "SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM " . PREFIX . "_post WHERE ".$stop_list.$where_category." AND approve".$where_date.$order_by." LIMIT ".$custom_from.",".$custom_limit; Теперь в шаблонах, обязательно во всех тегах custom добавляем random="no", а в тех, где поставили random="yes", нужно отключить кеширование cache="no". ps Я использовал данный модуль на своём сайте для баннерной ротации новостей {custom category="48" template="rand" aviable="global" from="0" limit="1" cache="no" random="yes"} где rand.tpl <a href="{full-link}"><img src="[xfvalue_random-img]" alt="{title}" /></a> где [xfvalue_random-img] - это адрес картинки, вставляемый в новости через дополнительное поле Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 10 ноября 2008 Рассказать Опубликовано: 10 ноября 2008 blagoy_vip, при большом количестве новостей и хорошей посещаемости сайт положит, потому что RAND() вещь тяжёлая) Отлично, будем знать куда не стоит обращатся за написанием модов) Цитата Ссылка на сообщение Поделиться на других сайтах
blagoy_vip 7 Опубликовано: 10 ноября 2008 Рассказать Опубликовано: 10 ноября 2008 Автор Ну может быть и тяжелая, кому надо - заберут )) Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 13 ноября 2008 Рассказать Опубликовано: 13 ноября 2008 Саш, это не тот rand() Это rand() MySQL'я, а он тяжестью не страдает =) Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 13 ноября 2008 Рассказать Опубликовано: 13 ноября 2008 Это rand() MySQL'я, а он тяжестью не страдает =) еще как страдает, в запросе используется сортировка, например выборка 5 значений и каждый раз эта функция перемешивает случайно всю БД, потом берет одно первое значение, потом опять перемешивает, берет второе и т.д. Это очень сложная в выполнении функция и на больших таблицах просто не применима, либо нужно иметь соответствующие ресурсы сервера. По крайней мере так было в MySQL4 может в пятой версии они что и оптимизировали в данном вопросе Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 13 ноября 2008 Рассказать Опубликовано: 13 ноября 2008 А если так? SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m) =========================================================== Posted by Ravenous Bugblatter Beast on August 15 2006 If you are selecting a wide result set and using ORDER BY RAND() with a LIMIT, you can often speed things up by changing a query of the form: SELECT id, col1, col2, ... , colN FROM tab WHERE conditions ORDER BY RAND() LIMIT m To a query of the form: SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m) Although the second query has to perform an additional select, it only has to sort a result set containing the single id column, rather than the full result set you are returning from the query. =========================================================== it's true, but if we have a big database with 1000ths of table rows and we must to join them ...... so oooops Lately I saw the following link http://jan.kneschke.de/projects/mysql/order-by-rand/ .....you can read here how to get more speed from your executing query in some cases. First read the explanation and see bottom of the page: ============================================================ Performance Now let's see what happends to our performance. We have 3 different queries for solving our problems. * Q1. ORDER BY RAND() * Q2. RAND() * MAX(ID) * Q3. RAND() * MAX(ID) + ORDER BY ID Q1 is expected to cost N * log2(N), Q2 and Q3 are nearly constant. The get real values we filled the table with N rows ( one thousand to one million) and executed each query 1000 times. ---------------------------------------------------------- Rows ||100 ||1.000 ||10.000 ||100.000 ||1.000.000 ---------------------------------------------------------- Q1||0:00.718s||0:02.092s||0:18.684s||2:59.081s||58:20.000s Q2||0:00.519s||0:00.607s||0:00.614s||0:00.628s||0:00.637s Q3||0:00.570s||0:00.607s||0:00.614s|0:00.628s ||0:00.637s ---------------------------------------------------------- As you can see the plain ORDER BY RAND() is already behind the optimized query at only 100 rows in the table. ============================================================ Да уж... Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 13 ноября 2008 Рассказать Опубликовано: 13 ноября 2008 IT-Security, да я тоже слегка пробежался по форумам с этой темой, плюс документации мускула - последняя не советует, на форумах в большинстве своём тоже. SELECT id, col1, col2, ... , colN FROM tab WHERE id IN (SELECT id FROM tab WHERE conditions ORDER BY RAND() LIMIT m) в основном именно это предлагают как выход. В своей галерее я сделал иначе - беру ид 1000 последних фото, сохраняю в кэш и рэндомно выбираю ид - пока народ не жаловался. Цитата Ссылка на сообщение Поделиться на других сайтах
alex32 942 Опубликовано: 3 июля 2011 Рассказать Опубликовано: 3 июля 2011 Скажите пожалуйста, данный хак у кого-нибудь работает на 9,3? Делаю все по инструкции, но независимо от того, прописанно ли random random="yes" или random="no" ВСЕ новости на сайте, что выводятся через custom, выводятся рэндомно. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.