Вложенный в цикл SQL запрос, решения по оптимизации?

Доброе время суток.

Занимаюсь небольшим проектом на php, разделяя код и дизайн дошел до следующего:
<? foreach($categories as $cat): ?>
	<li><p class="categories"><?=$cat['title']?></p>
		<foreach(getSubCat($cat['cat_id']) as $subcat): ?>
			<p class="subcats"><?=$subcat['title']?></p>
		<? endforeach ?>
	</li>
<? endforeach ?>

Смысл выше изложенного шаблона, первый массив категорий формируется в скрипте, и при выводе мы уже просто работаем с переменной, но вот второй... его содержимое для каждой категории свое, и мы получаем его функцией getSubCat с параметром в виде текущей категории (и для нее выбираем под категории), в функции происходит обычный sql запрос и возврат массива с результатами.
И вся беда в том, что один и тот же унылый запрос-функцию придется выполнять N количество раз (в зависимости от количества под категорий). Есть идея хранить айди категории (который передается функции) в сессии пользователя, но как хранить результат работы функции - в глобальном массиве?
Должны быть какие то другие решения которые я еще не осмыслил, smarty и остальные решения шаблонизаторы можно рассмотреть только как пример кода, задача обойтись нативным php без их внедрения в проект, перенос вывода в переменную скрипта тоже не решение - нарушается гармония кода и дизайна.
  • Вопрос задан
  • 4547 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `cat`.`id` AS `catId`, `cat`.`title` AS `catTitle`, `subcat`.`title` AS `subcatTitle` 
    FROM `categories` AS `cat` 
        LEFT JOIN `subcategories` AS `subcat` ON `cat`.`id` = `subcat`.`cat_id` 
    ORDER BY `cat`.`id`

<?php
$cat = -1;
foreach ($result as $row) {
    if ($row['catId'] != $cat) {
        echo ($cat == -1 ? "" : "<\li>")."<li><p class='categories'>{$row['catTitle']}</p>";
        $cat = $row['catId'];
    }
    echo "<p class='subcats'>{$row['subcatTitle']}</p>";
}
if ($cat != -1)
    echo "</li>";
?>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Mike77
@Mike77
lamp sf2 yii разработчик
Ответ написан
Комментировать
@IvanG Автор вопроса
Mike77, спасибо за теорию, но действительно SELECT'ом с объединением можно добиться тех же результатов "на лету" (а я раньше не вчитывался в опции объединения и зря...), только потом придется разделить полученные данные на несколько массивов. Не хилый объем может получится, для моего конкретного случая подходит, но не является истиной для всех.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы