Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: объединить пару запросов в один

Сообщения:  [1-10]    [11-20]  [21-23] 

 
 автор: ladan   (21.03.2012 в 10:37)   письмо автору
 
   для: Valick   (21.03.2012 в 07:30)
 

понял, такие вещи у меня из бд вытаскиваются и на них автоматом ссылки ставятся :) Надо подумать как сделать такое с чпу..

  Ответить  
 
 автор: ladan   (21.03.2012 в 10:35)   письмо автору
 
   для: Lotanaen   (21.03.2012 в 09:58)
 

а я вот ща подумал, стоит ли вообще хешировать, с 30к записями меню быстро создается(весь код на странице примерно за 0,08 секунд "создается").
Заметил, что если считать строки вот так:

<?
$res 
mysql_query("SELECT * FROM objects");
echo 
mysql_num_rows($res); 
?>
и вот так:
<?
$res 
=  mysql_query("SELECT COUNT(*) FROM objects");
echo 
mysql_result($res,0);
?>

То во втором случае запрос намного быстрее считает записи, чем в первом. То есть получается, что если нам только быстро посчитать нужно, то лучше использовать COUNT(*)?

  Ответить  
 
 автор: Lotanaen   (21.03.2012 в 09:58)   письмо автору
 
   для: ladan   (20.03.2012 в 21:13)
 

простой способ: создавать файл с меню и каждый раз при выдаче страницы проверять дату его изменения, если дата больше определенного времени то перезаписывать его, а если меньше то просто вставлять его с помощью include();

  Ответить  
 
 автор: Valick   (21.03.2012 в 07:30)   письмо автору
 
   для: ladan   (21.03.2012 в 02:24)
 

пошли какие-то ошибки и потом во все забанили :))
ух, как в детективе :) прикольно если вы им базу "уронили", хотя вряд ли
ну я на основе данных и формирую ссылку.
нет, у вас вся ссылка прописана руками (и адрес и значение) динамически подставляется только количество, т.е. если вы добавите раздел, то вам придется править код

  Ответить  
 
 автор: ladan   (21.03.2012 в 02:24)   письмо автору
 
   для: Valick   (20.03.2012 в 23:29)
 

ну я на основе данных и формирую ссылку... есть записи, выводим, нет значит ну и не надо :) Согласен, код громадный и это только 1/6 часть его.. инклюдю его, чтоб не видеть этого страха :) Да с 5-30к записями сайт летает, хотя что значит летает? на хостинге замерял время формирования меню с 30к записями и показывает примерно 0,08 секунд, хотя по факту страница дольше открывается(наверно из-за инета 256кбит/сек) Вот 3 часа назад для эксперимента попытался 2 миллиона записей вставить в бд циклом и потом проверить как сайт будет работать, но ответа от цикла не дождался... пошли какие-то ошибки и потом во все забанили :))

  Ответить  
 
 автор: Valick   (20.03.2012 в 23:29)   письмо автору
 
   для: ladan   (20.03.2012 в 21:13)
 

неправильно вы делаете, ссылка должна формироваться автоматически на основе данных из БД, ну или хотя бы содержаться в БД целиком, а не прописываться руками в коде
_
не поможет вам кеширование, у вас бардак в коде :(

  Ответить  
 
 автор: ladan   (20.03.2012 в 21:13)   письмо автору
 
   для: Lotanaen   (20.03.2012 в 14:35)
 

Спасибо большое :) А как кеширование для меню сделать? Это через header()? Если да, что в него примерно писать нужно?

  Ответить  
 
 автор: Lotanaen   (20.03.2012 в 14:35)   письмо автору
 
   для: ladan   (20.03.2012 в 14:12)
 

В данном фрагменте кода вам можно воспользоваться и одним запросом вида:


$objects = mysql_query("SELECT category FROM objects WHERE zone='Анапа' AND category!='' AND moderator='1' GROUP BY category");

if (mysql_num_rows($object)>0) {
   while($rows= mysql_fetch_array($object)) {
        if ($rows['category'] == "отели") {
        вывод ссылки
        }и т.д.
   }

}

Это как вариант.
Возможен еще вариант одним запросом все возможные сочетания выбрать - примерно таким образом:


$objects = mysql_query("SELECT *, DISTINCT CONCAT(zone,category) as param FROM objects WHERE category!='' AND moderator='1' ORDER BY category, zone");



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

  Ответить  
 
 автор: ladan   (20.03.2012 в 14:12)   письмо автору
 
   для: Valick   (20.03.2012 в 12:35)
 

просто так сложилось когда поля создавал :) ну и запросы короче выглядят на 2 символа, чем если было бы moderator='yes' :)


Добавил в таблицу 1 миллион записей и смотрю скольо времени уходит на обработку

первый вариант выборки
<?
mysql_query
("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category!='' AND moderator='1'
            UNION ALL 
           SELECT COUNT(*) FROM objects WHERE zone='Витязево' AND category!='' AND moderator='1'
          UNION ALL
          SELECT COUNT(*) FROM objects WHERE zone='Геленджик' AND category!='' AND moderator='1'
          UNION ALL
          SELECT COUNT(*) FROM objects WHERE zone='Сочи' AND category!='' AND moderator='1'
           UNION ALL
          SELECT COUNT(*) FROM objects WHERE zone='Туапсе' AND category!='' AND moderator='1'
           UNION ALL
          SELECT COUNT(*) FROM objects WHERE zone='Темрюк' AND category!='' AND moderator='1'
          
      
          ;"
);
?>

Второй вариант
<?
mysql_query
("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category!='' AND moderator='1'");
mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Витязево' AND category!='' AND moderator='1'");
mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Геленджик' AND category!='' AND moderator='1'");
mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Сочи' AND category!='' AND moderator='1'");
mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Туапсе' AND category!='' AND moderator='1'");
mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Темрюк' AND category!='' AND moderator='1'");    
?>

Что в первом варианте, что во втором- ~0,8 секунд уходит на один запрос. Это только 6 запросов, а всего 66(ну вот примерно 1 минуту ждать)... Конечно 1 миллиона жилья у меня на сайте не будет , но все равно времени много уходит на обработку...

Ваш вариант не знаю как применить.. в конечном итоге нужно через mysql_result($res,0),mysql_result($res,1),mysql_result($res,2) и тп проверять условие и потом генерировать меню.

Сейчас на сайте сделано так (меню по региону Анапа):


<?
<li>
                    <
a href="http://anapaoteli/otdyh-v-anape/">Отдых в Анапе</a>
                    
     <? 
$objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category!='' AND moderator='1'"); $anapa mysql_result($objects,0); 
     if(
$anapa 0) {echo "<ul>";}?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='отели' AND moderator='1'");  $oteli mysql_result($objects,0);
               if(
$oteli 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/oteli/'>Анапа отели <span class='num'>(".$oteli.")</span></a></li>";}
               
               
?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='Мини-гостиницы' AND moderator='1'"); $mini_gostinitsy mysql_result($objects,0);
               if(
$mini_gostinitsy 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/mini-gostinitsy/'>Анапа мини-гостиницы <span class='num'>(".$mini_gostinitsy.")</span></a></li>";}
               
?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='гостевые дома' AND moderator='1'");  $gostevye_doma mysql_result($objects,0); 
               if(
$gostevye_doma 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/gostevye-doma/'>Анапа гостевые дома <span class='num'>(".$gostevye_doma.")</span></a></li>";}
               
?>
               <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='частные сектора' AND moderator='1'");  $chastnye_sektora mysql_result($objects,0); 
               if(
$chastnye_sektora 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/chastnye-sektora/'>Анапа частные сектора <span class='num'>(".$chastnye_sektora.")</span></a></li>";}
               
?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='коттеджи' AND moderator='1'");  $kottedzhi mysql_result($objects,0); 
               if(
$kottedzhi 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/kottedzhi/'>Анапа коттеджи <span class='num'>(".$kottedzhi.")</span></a></li>";}
               
?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='квартиры' AND moderator='1'");  $kvartiry mysql_result($objects,0); 
               if(
$kvartiry 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/kvartiry/'>Анапа квартиры <span class='num'>(".$kvartiry.")</span></a></li>";}
               
?>
               <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='дома' AND moderator='1'");  $doma mysql_result($objects,0); 
               if(
$doma 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/doma/'>Анапа дома <span class='num'>(".$doma.")</span></a></li>";}
               
?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='детские лагеря' AND moderator='1'");  $detskie_lagerya mysql_result($objects,0); 
               if(
$detskie_lagerya 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/detskie-lagerya/'>Анапа детские лагеря <span class='num'>(".$detskie_lagerya.")</span></a></li>";}
               
?>
                <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='санатории' AND moderator='1'");  $sanatorii mysql_result($objects,0); 
               if(
$sanatorii 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/sanatorii/'>Анапа санатории <span class='num'>(".$sanatorii.")</span></a></li>";}
               
?>
               <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='пансионаты' AND moderator='1'");  $pansionaty mysql_result($objects,0); 
               if(
$pansionaty 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/pansionaty/'>Анапа пансионаты <span class='num'>(".$pansionaty.")</span></a></li>";}
               
?>
               <? $objects mysql_query("SELECT COUNT(*) FROM objects WHERE zone='Анапа' AND category='базы отдыха' AND moderator='1'");  $bazy_otdyha mysql_result($objects,0); 
               if(
$bazy_otdyha 0)
               { echo  
"<li><a href='http://anapaoteli/otdyh-v-anape/bazy-otdyha/'>Анапа базы отдыха <span class='num'>(".$bazy_otdyha.")</span></a></li>";}
               
?>
                <? if($anapa 0) {echo "</ul>";} ?>
</li>
?>

а там еще и Туапсе, Сочи и тп

Может как-то можно это все оптимизировать, чтоб за 1 запрос проверялись все варианты и результаты заносились, к примеру, в массивы? а потом посчитать колличество элементов в каждом массиве и уже формировать также меню..

  Ответить  
 
 автор: Valick   (20.03.2012 в 12:35)   письмо автору
 
   для: ladan   (20.03.2012 в 11:22)
 


<?php
$query
="SELECT category, COUNT(category) t FROM objects 
WHERE zone='Анапа' AND ( category!='' OR category='Дома' OR category='Квартиры' ) AND moderator='1'
GROUP BY category"
;
$res=mysql_query($query);
where($a=mysql_fetch_assoc($res)){
echo 
$a[category]." -> ".$a[t]."<br />";
}
?>


кстати почему поле модератор имеет тип символьный?

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-23] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования