|
|
|
| Здаствуйсте, есть запросы такого типа:
<?
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'");
?>
|
Можно ли их объединить в один запрос и потом значения брать из
$object = mysql_result($objects,0);
| ? | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 09:20)
| | кроме AND еще существует и OR | |
|
|
|
|
|
|
|
для: Valick
(20.03.2012 в 10:02)
| | я знаю, но мне нужно строго так. Так можно ли объединить все это и потом вытаскивать значения? Если можно пример пожалуйста :) | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 10:36)
| | UNION ALL возможно вас устроит | |
|
|
|
|
|
|
|
для: Lotanaen
(20.03.2012 в 10:42)
| | спасибо, а можете пожалуйста в примере, я умею только с одной таблицей в одном запросе работать.. | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 11:01)
| |
<?
$result = 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'");
while ($rows = mysql_fetch_array($result))
echo $rows[0];
?>
|
| |
|
|
|
|
|
|
|
для: Lotanaen
(20.03.2012 в 11:06)
| | спасибо, а в скорости большая разница будет, чем если делать 66 запросов? | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 11:18)
| | а откуда и каких 66 запросов? | |
|
|
|
|
|
|
|
для: Lotanaen
(20.03.2012 в 11:20)
| | Вообщем есть 6 регионов Краснодарского края и 11 категорий жилья для каждого региона(Дома, квартиры, отели и тп)
Люди регают свое жилье и менюшка в хедаре автоматически создает нужный раздел, если есть записи(как в том примере, что выше). Получается я сделал 66 запросов, чтоб можно потом было составить условие из if и вывести на экран раздел(ы). Вот ща через UNION ALL попробовал для 4 запросов и получилось :) Человек ходит по сайту и каждый раз в меню проходят 66 запросов, что думаю не очень хорошо :) А все 66 запросов по типу такие как я выше написал | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 11:27)
| | нужно кешировать как-то.... Самое простое - Сохранять готовое меню и инклюдить. И раз в, например, 15 минут обновлять. Да хоть и раз в минуту. Это будет легче серверу, чем если это будет делаться для каждой страницы для каждого пользователя. | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 11:27)
| | А вообще нужно доп. таблицу в которой будет храниться только количество объявлений и которая будет обновляться при модерации и обновлении объявлений, при удалении и т.п. | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 10:36)
| |
mysql_query("SELECT COUNT(*) FROM objects
WHERE zone='Анапа' AND ( category!='' OR category='Дома' OR category='Квартиры' ) AND moderator='1'");
|
| |
|
|
|
|
|
|
|
для: Valick
(20.03.2012 в 11:11)
| | а как потом посчитать сколько в запросе нашлось полей?(там где category!='' or OR category='Дома' OR category='Квартиры')
У меня на сайте меню формируется так, что если есть такие поля, то выводим раздел. Т.е если есть в Анапе квартиры, одобренные админом, то создаем раздел с квартирами :) и т.д | |
|
|
|
|
|
|
|
для: 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 />";
}
?>
|
кстати почему поле модератор имеет тип символьный? | |
|
|
|
|
|
|
|
для: 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 запрос проверялись все варианты и результаты заносились, к примеру, в массивы? а потом посчитать колличество элементов в каждом массиве и уже формировать также меню.. | |
|
|
|
|
|
|
|
для: 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 минут) обновлять кэш. | |
|
|
|
|
|
|
|
для: Lotanaen
(20.03.2012 в 14:35)
| | Спасибо большое :) А как кеширование для меню сделать? Это через header()? Если да, что в него примерно писать нужно? | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 21:13)
| | неправильно вы делаете, ссылка должна формироваться автоматически на основе данных из БД, ну или хотя бы содержаться в БД целиком, а не прописываться руками в коде
_
не поможет вам кеширование, у вас бардак в коде :( | |
|
|
|
|
|
|
|
для: Valick
(20.03.2012 в 23:29)
| | ну я на основе данных и формирую ссылку... есть записи, выводим, нет значит ну и не надо :) Согласен, код громадный и это только 1/6 часть его.. инклюдю его, чтоб не видеть этого страха :) Да с 5-30к записями сайт летает, хотя что значит летает? на хостинге замерял время формирования меню с 30к записями и показывает примерно 0,08 секунд, хотя по факту страница дольше открывается(наверно из-за инета 256кбит/сек) Вот 3 часа назад для эксперимента попытался 2 миллиона записей вставить в бд циклом и потом проверить как сайт будет работать, но ответа от цикла не дождался... пошли какие-то ошибки и потом во все забанили :)) | |
|
|
|
|
|
|
|
для: ladan
(21.03.2012 в 02:24)
| | пошли какие-то ошибки и потом во все забанили :))
ух, как в детективе :) прикольно если вы им базу "уронили", хотя вряд ли
ну я на основе данных и формирую ссылку.
нет, у вас вся ссылка прописана руками (и адрес и значение) динамически подставляется только количество, т.е. если вы добавите раздел, то вам придется править код | |
|
|
|
|
|
|
|
для: Valick
(21.03.2012 в 07:30)
| | понял, такие вещи у меня из бд вытаскиваются и на них автоматом ссылки ставятся :) Надо подумать как сделать такое с чпу.. | |
|
|
|
|
|
|
|
для: ladan
(20.03.2012 в 21:13)
| | простой способ: создавать файл с меню и каждый раз при выдаче страницы проверять дату его изменения, если дата больше определенного времени то перезаписывать его, а если меньше то просто вставлять его с помощью include(); | |
|
|
|
|
|
|
|
для: 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(*)? | |
|
|
|