Каталог ссылок

IGonza

Guest
Каталог ссылок

Прочитал про деревья тут на форуме все что можно, не помогло...
Есть две таблицы :
1. Category:
id_cat title parent_id
2. Link:
id_link title category_id

Необходимо подсчитать количество links в заданной категории, учитывая ссылки во вложенных подкатегориях.

Надеюсь обьяснил понятно.
 

tashkentchi

Новичок
Вот както так:
PHP:
function categoryIdList($list) {
   $sql = "SELECT DISTINCT `id_cat`
      FROM `Category`
      WHERE `parent_id` IN (".$list.")";
   $result = mysql_query($sql) or die(mysql_errno().mysql_error());
   $list2 = '';
   while ( $data = mysql_fetch_array($result) ) {
      if ( $list2 ) $list2 .= ",";
      $list2 .= $data[0];
   }
   if ( $list2) { return $list.",".categoryIdList($list2); }
   return $list;
}
$sql = 'SELECT COUNT(*)
   FROM `Link`
   WHERE `category_id` IN ('.categoryIdList($id_cat).')';
 

Фанат

oncle terrible
Команда форума
ужасно, ужасно.
нафига, спрашивается, тут вообще БД нужна, если всё делается с помощью этой ужасной рекурсии...
 

tashkentchi

Новичок
А если у тебя много уровней вложенности, как ты без рекурсии обойдешься?
 

Фанат

oncle terrible
Команда форума
а я не говорю, что рекурсия не нужна.
Я говорю, что нафига тут напяливать плоскую БД на дерево.

Да и какие там уровни - в каталоге-то ссылок? 3-5 максимум.
 

tashkentchi

Новичок
Если число уровней заранее неизвестно, то при данной структуре БД без рекурсии не обойтись. В небольшом каталоге будет работать быстро. Если же дерево большое (каталог лекарств, напр.), то имеет смысл создать доп. таблицу. У меня она выглядит так:
SUBJECT_ID, SUBJECT_CHILD_ID, DIRECT_INCOMING
в которой храню все пары "предок -> потомок" с указанием уровня вложенности.
При изменениях в `Category` автоматом вносить изменения в эту доп. таблицу. Тормознутость изменения оборачивается высокой скоростью выборки данных. Юзерам ничего более и не надо.
 

Фанат

oncle terrible
Команда форума
да при чём здесь заранее знать число уровней?
Дело не в точном числе, а в предельном.
Для БОЛЬШИНСТВА приложений вполне подходит примитивная система, хранящая путь к каждому элементу.
99% случаев покрываются ей.

А люди парятся с нестед сетс, с деревьями, рекурсиями и прочей ботвой.

Типичный пример общения спеца с юзером. "Папа, ты с кем сейчас разговаривал?"
Проще надо быть.
 

IGonza

Guest
Число уровней заранее не известно, структуру базы тоже поменять не могу. Всем спасибо за ответы. Сейчас попробую то , написал tashkentchi. Я немного не так рекурсию делал, вот и запутался...

-~{}~ 07.06.05 16:02:

Большое спасибо. Помогло.
 
Сверху