Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > подсчет товаров и вывод дерева категорий


Автор: Igor_CH 18.5.2007, 18:40
Подскажите как правильно сделать.

Есть стандартное дерево категорий (ID PID).
В каждой категории (в подкатегории) есть свои товары своя таблица.

Как правильно сделать подсчет товаров в каждой категории? (дерево очень большое).

Делать объединение таблиц или же внутри дерева делать запрос на подсчет товаров (т.е. будет много запросов). Как правильно?

Автор: mishaSL 18.5.2007, 20:10
Igor_CH, до конца структуру вашей БД я так и не понял.
Цитата(Igor_CH @  18.5.2007,  18:40 Найти цитируемый пост)
сделать подсчет товаров

Вы имеете ввиду количество товаров в категории или что?
Цитата(Igor_CH @  18.5.2007,  18:40 Найти цитируемый пост)
Делать объединение таблиц или же внутри дерева делать запрос на подсчет товаров (т.е. будет много запросов).

Быстрее должно работать объединение таблиц в одном запросе, чем множество запросов.

Автор: SelenIT 19.5.2007, 02:34
mishaSL, чего ж в этой структуре непонятного? Дерево категорий в виде списка смежности в одной таблице, товары - в другой...

Igor_CH, конечно, лучше одним запросом. Вот проверенный пример построения дерева с одновременным подсчетом товаров в категориях и подкатегориях:
Код

function mk_tree($id) {
    global $tree;
    $html = '<ul>';
    $goods_count = 0;
    foreach($tree[$id] as $child) {
        $html .=  '<li>'.$child['name'];
        if (isset($tree[$child['id']])) {
            list($subtree_html, $goods_in_subtree) = mk_tree($child['id']);
        }
        else list($subtree_html, $goods_in_subtree) = array('',0);
        $goods_in_category = $child['items']+$goods_in_subtree;
        $html .= ' (товаров: '.$goods_in_category.')</li>'.$subtree_html;
        $goods_count += $goods_in_category;
    }
    $html .= '</ul>';
    return array($html, $goods_count);
}

$q = "SELECT c.id, c.pid, c.name, count(g.id) AS items FROM categories AS c LEFT JOIN goods g ON g.category_id = c.id GROUP BY c.id ORDER BY c.pid";

$r = mysql_query($qqq) or die(mysql_error());

$tree = array();
while ($f = mysql_fetch_assoc($r)) {
    $tree[$f['rubricid']][] = $f;
}
$res = mk_tree(0);
echo $res[0];
echo '<p>Всего: '.$res[1].'</p>';

P.S. Предполагается, что категории корневого уровня имеют PID=0. Дерево из >1000 категорий с (в общей сложности) >4700 товаров у меня строится за <0.1 c.

Автор: Igor_CH 21.5.2007, 16:47
Спасибо, буду пробывать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)