2012-03-14 5 views
0

У меня есть база данных со следующими столбцами:счетных все подкатегории Whitin категории

id, parent, name, description 

id был установлен в автоматический incerement. Я хочу получить общее количество всех подкатегорий, которые являются inisde родительской категорией (у которой ее родительский набор равен 0). Я также хочу, чтобы это было рекурсивным. Каким может быть способ поститься?

Я уже написал следующую функцию, но я не могу проверить это на данный момент:

function CountDeepSubCategories($parentID, $max = 0) 
{ 
    global $_DB; 

    $all = $all + $max; 

    $q = $_DB->Query("SELECT id FROM category_cats WHERE parent = $parentID"); 
    $id = $_DB->GetResultValue($q, 0, 'id'); 

    $num = $_DB->GetResultNumber($q);  

    for($i = 0; $i < $num; $i++) 
    { 
     CountDeepSubCategories($id, $all); 
    } 

    return $all;   
} 
+1

Если есть не так много записей (например, 100), но в глубине вложенности (3+ уровней), лучше получить всю таблицу и построить дерево в 'php'. – kirilloid

+0

Что именно вам нужно? Текст вопроса предлагает информацию (подкатегории), но код предлагает целое число, хотя ваш код не будет делать много, поскольку вы никогда не используете возвращаемое значение своей рекурсивной функции. – jeroen

+0

Извините, что было неясно, я имею в виду, что мне нужно знать, сколько суб и суб-суб и .... категорий, принадлежащих родительской категории (у которой есть родительский столбец как 0) –

ответ

1

имеет в каждой категории есть родитель? если вы можете сделать «SELECT COUNT (*) из category_cats» :)

нормально, второй комментарий, который вы опубликовали, почему бы вам просто добавить инсайдерскую запрос, как это:

select cct.id, 
    (select count(1) from category_cats where parent=cct.id) as subcount 
from category_cats cct 

Я не тестировал его, но он должен работать.

1

Рекурсия кажется элегантным решением, но далеко не лучшим исполнителем. Возможно, вы захотите сохранить дерево категорий как Nested Set, что является довольно накладными расходами при вставке новых записей, однако оно дает преимущество получения всего дерева одним простым SQL-запросом.

2

Взгляните на презентацию от Билла Карвина по телефону http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back (ваша проблема описана на стр. 48). Он объясняет плюсы и минусы вашего решения и предлагает три других и сравнивает их друг с другом.

+0

Эта презентация фактически основана на [SQL Antipatterns ] (http://pragprog.com/book/bksqla/sql-antipatterns) книга .. это любопытное обязательное ИМХО. –

+0

Я не являюсь аффилированным лицом к Биллу Карвину, но я должен сказать, что эта книга была довольно заметным. Очень хорошо, и, как вы сказали, должно быть, если вы чаще работаете с SQL. –

Смежные вопросы