Рекурсивный вызов "select count(*)..."

grey109

Новичок
Рекурсивный вызов "select count(*)..."

Есть каталог товаров. Категории описаны так:

CREATE TABLE categories (
`category_id` INT(8) NOT NULL AUTO_INCREMENT,
`category_parentid` int(8) not NULL,
...

а товары в категориях так:
CREATE TABLE offers (
`offer_id` INT(8) NOT NULL AUTO_INCREMENT,
`category_id` int(8) not NULL,
...

Как видно из первой таблицы, количество вложенности категории не ограничено. Иного бывает так что в подкатегориях нет товаров, и вывод таких категории на экран пользователю не нужен.


Вопрос: как найти эти подкатегории, в цепочки которых от первой до последней категории нет товаров?


PS: на всякий случай mysql 3.2x.xx
 

grey109

Новичок
Не совсем понимаю зачем ты спрашиваешь, но код такой:

$result = mysql_query ("select offer_id, name... from offers where category_id=".$_GET['category_id']);
while ()
{

}

Вся засада в том, что я никак не могу придумать как пройтись по дереву категории и узнать количество товаров. Например, при таком раскладе:

1. - главная категория
1.1 - 0 товаров
1.1.1 - 0 товаров
...
1.1.5 - 0 товаров

выводить категорию не нужно.


А при:

1. - главная категория
1.1 - 0 товаров
1.1.1 - 0 товаров
...
1.1.5 - 1 товар

нужно.
 

Гравицапа

elbirret elcno
grey109
Интересно кусок кода...

как пройтись по дереву категории и узнать количество товаров
Ну видимо надо рекурсивно пройти по дереву и "посчитать" количество товаров в подкатегориях? И если подобная написанная тобой функция вернёт нолик, то категорию не выводить? Ты же сам в заголовке темы почти ответ написал?..
 

grey109

Новичок
Гравицапа
Подскажи, плз, как пройтись по дереву рекурсивно? Что-то я никак не соображу.

Что-то вроде:

$result = mysql_query ("select category_id from categories");
while ()
{
$x = check($category_id);

if ($x!=0) ...
}


function check($category_id)
{
$total = 0;

$result = mysql_query (...);

check($category_id);
}

-~{}~ 03.07.07 22:33:

Вроде бы сделал, работает.
 

Nez

Новичок
function ShowTree( $ParentID, $lvl )
{
include("../../config.php");
static $parent = array();

$sql = "SELECT * FROM $ou WHERE IDParentOU = ".$ParentID." and IDOU!=IDParentOU ORDER BY `IDOU`";
$res = mysql_query( $sql );

if ( mysql_num_rows( $res) > 0 )
{
$lvl++;
while ( $obj = mysql_fetch_object( $res ) )
{
$sep = ( sizeof( $parent ) > 0 ) ? '--' : '';
$show = '<option value="'.$obj->IDOU.'">-- ' .implode( ' -- ', $parent ).$sep.''.$obj->OUName.'</option> ';

echo $show;
ShowTree( $obj->IDOU, $lvl );
$lvl--;
unset( $parent[ ( sizeof( $parent ) - 1 ) ] );


}
}
}

я когда то эт написал, тут главное чтобы в моем случае IDOU!=IDParentOU ... скрипт староват, надо бы доработать, но факт то, что он идет от самой конечной ветви к самому началу ..

п.с. база состояла из OUName(название ou) IDOU(его айди) IDParentOU(к какому он принадлежит)

структура примерно такая

IDOU IDParentOU
1 1
2 1
3 2
4 3
5 4
6 5

п.с. за ошибки сорри .... =)
 

Nez

Новичок
=) скорее всего не понял проблемы =) ...

не не индус ... и не жалею =)

написал же, скрипт староват, учитывая что я его писал 3 года назад, факт то, что он работает (правд не помню как+))))
лан сорри =) в след раз прочитаю полностью тему, перед постингом
 
Сверху