|
|
|
| Добрый день!
Есть база, с таблицами:
1. rubrics (rubric_id, name) - Рубрики
2. sub_rubics (sub_rubric_id, name, rubric_id) - Подрубрики
3. contacts_sub_rubrics (contact_sub_rubric_id, contact_id, sub_rubric_id) Одинаковые контакты, расположенные в разных рубриках и подрубриках
4. towns (town_id, name, st_id) - Города
5. states (state_id, name)[/b] - Страны
6. contacts (contact_id, name, town_id) - Ну и сами контакты
|
В общем вот, я, конечно, написал не все столбцы, только те которые нужны для запроса.
Есть запрос:
<?
$db->query('CREATE TEMPORARY TABLE cnts (SELECT DISTINCT cts.contact_id, cts.town_id,
sr.sub_rubric_id, sr.name AS subrubric, rbs.rubric_id, rbs.name AS rubric, towns.name AS town, st.name AS country
FROM contacts AS cts
INNER JOIN contacts_sub_rubrics AS csr ON cts.contact_id = csr.contact_id
INNER JOIN sub_rubrics AS sr ON csr.sub_rubric_id = sr.sub_rubric_id
INNER JOIN rubrics AS rbs ON rbs.rubric_id = sr.rubric_id
INNER JOIN towns ON cts.town_id = towns.town_id
INNER JOIN sitys AS st ON st.id = towns.st_id
WHERE towns.town_id='.$this->id_city_active.')
');
?>
|
После этого я работаю уже с этой таблицей, вытаскивая с нее список рубрик, подрубрик и количества контактов в каждой подрубрике в виде:
Рубрика_1
Подрубрика_1 (кол-во контактов)
Подрубрика_2 (кол-во контактов)
Рубрика_2
Подрубрика_3 (кол-во контактов)
Подрубрика_4 (кол-во контактов)
и т.д.
последовательными запросами:
<?
$db->query('SELECT DISTINCT rubric_id, rubric FROM cnts ORDER BY rubric');
$db->query("SELECT DISTINCT sub_rubric_id, subrubric FROM cnts WHERE `rubric_id`='$rubric_id' ORDER BY subrubric");
$db->query("SELECT COUNT(*) as `count` FROM cnts WHERE `rubric_id`='$rubric_id' and `sub_rubric_id`='$sub_rubric_id'");
?>
|
Делаю так, т.к нужно вытащить только те рубрики и подрубрики, которые есть в данном городе, т.е на самом деле рубрик и подрубрик в таблицах
rubrics и sub_rubrics много, но мне нужны только те, в которых есть контакты по данному городу.
Вопрос вот в чем: Как можно всё это упростить, т.к выполнение всех этих запросов занимает много времени.
Заранее благодарен за ответ!
P.S. Прилагаю код всей моей функции
<?
// Метод возвращает рубрикатор
function get_rubricator() {
global $db;
$db->query('CREATE TEMPORARY TABLE cnts (SELECT DISTINCT cts.contact_id, cts.town_id,
sr.sub_rubric_id, sr.name AS subrubric, rbs.rubric_id, rbs.name AS rubric, towns.name AS town, st.name AS country
FROM contacts AS cts
INNER JOIN contacts_sub_rubrics AS csr ON cts.contact_id = csr.contact_id
INNER JOIN sub_rubrics AS sr ON csr.sub_rubric_id = sr.sub_rubric_id
INNER JOIN rubrics AS rbs ON rbs.rubric_id = sr.rubric_id
INNER JOIN towns ON cts.town_id = towns.town_id
INNER JOIN sitys AS st ON st.id = towns.st_id
WHERE towns.town_id='.$this->id_city_active.')
');
$q_rubrics = $db->query('SELECT DISTINCT rubric_id, rubric FROM cnts ORDER BY rubric');
if ($db->num_rows($q_rubrics) > 0) {
$this->tpl_rubricator .= '<div id="rubric_list">';
while ($rub_rw = $db->get_array($q_rubrics)){
$id_rubric = $rub_rw["rubric_id"];
$name_rubric = $rub_rw["rubric"];
$this->tpl_rubricator .= '<a href="javascript:void(0)"><img src="images/circle_right.gif"/>'.$name_rubric.'</a>'."\n";
$srQuery = $db->query("SELECT DISTINCT sub_rubric_id, subrubric FROM cnts WHERE `rubric_id`='$id_rubric' ORDER BY subrubric");
if ($db->num_rows($srQuery) > 0) {
$this->tpl_rubricator .= '<div class="subrubric">';
while ($subrub_rw = $db->get_array($srQuery)){
$id_subrubric = $subrub_rw["sub_rubric_id"];
$name_subrubric = $subrub_rw["subrubric"];
$CountQuery = $db->query("SELECT COUNT(*) as `count` FROM cnts WHERE `rubric_id`='$id_rubric' and `sub_rubric_id`='$id_subrubric'");
$count_row = $db->get_row($CountQuery);
$this->tpl_rubricator .= '<a href="?r='.$id_rubric.'&sr='.$id_subrubric.'">'.$name_subrubric.' ('.$count_row['count'].')'.'</a>'."\n";
}
$this->tpl_rubricator .= '</div>';
}
}
$this->tpl_rubricator .= '</div>';
}
$db->free();
return $this->tpl_rubricator;
}
?>
|
| |
|
|
|
|
|
|
|
для: Rustamich
(25.03.2009 в 14:19)
| | Неужели никто не может помочь??? | |
|
|
|
|
|
|
|
для: Rustamich
(25.03.2009 в 14:19)
| | Люди, срочно надо, пожалуйста помогите!!! | |
|
|
|
|
|
|
|
для: Rustamich
(26.03.2009 в 15:06)
| | Очевидно, следует начать с того, что избавить первый запрос от константной составляющей,
вытащив данные о городе и регионе отдельным запросом, убрав их из построения таблицы и поменяв
INNER JOIN towns ON cts.town_id = towns.town_id
INNER JOIN sitys AS st ON st.id = towns.st_id
WHERE towns.town_id='.$this->id_city_active.')
|
на
WHERE cts.town_id='.$this->id_city_active.')
|
ну и вообще говоря, у Вас чуть ли не во всех запросах используется DISTINCT , что тоже гасит скорость. | |
|
|
|
|
|
|
|
для: Trianon
(26.03.2009 в 15:33)
| | Спасибо что ответили! DISTINCT я использую чтобы выбрать с созданной таблицы количество контактов только определенной подрубрики. А на что это можно заменить? | |
|
|
|
|
|
|
|
для: Rustamich
(26.03.2009 в 19:07)
| | на прямые запросы к соответствующим таблицам.
И последняя причина в том, что запросы эти Вы издаете в цикле. А значит - множество раз.
Уж коль скоро Вы создаете одну временную таблицу, почему не создать еще две-три? | |
|
|
|
|
|
|
|
для: Trianon
(26.03.2009 в 22:17)
| | Может вообще возможно заменить все запросы на более простые? | |
|
|
|
|
|
|
|
для: Rustamich
(29.03.2009 в 19:05)
| | Без детального анализа сказать трудно. Более простые тоже разные бывают. Кроме того, многое зависит от наполнения исходных таблиц. | |
|
|
|
|
|
|
|
для: Trianon
(29.03.2009 в 22:52)
| | Ясненько... Буду думать, может что и соображу... Спасибо за помощь! | |
|
|
|