Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Снова sql запрос
цитата
19/10/08 в 20:27
 Sterx
основная таблица БД - древовидная структура
можно как то посчитать количество элементов в ветках (подкатегориях) в одном запросе.
пока получется так, что обхожу все дерево, выдергивая id узлов
потом перебирая в массиве делаю COUNT(*) каждой ветки.
ну плюс еще по некоторым полям идет WHERE
есть менее ресурсоемкий путь?
цитата
19/10/08 в 20:50
 Formator
Так может у тебя неправильная структура. Любое дерево любой вложенности можно записать ввиде полей id и pid. Где id - номер записи, pid - номер родительской записи. А посчитать это элементарно с помощью COUNT(*) ... GROUP BY pid
цитата
19/10/08 в 21:11
 wMaster
SELECT DISTINCT `id`, COUNT(`какое-нить поле ветки`) FROM .... GROUP BY `id`
цитата
19/10/08 в 21:32
 Pentarh
рекурсивные стореные процедуры, функции рулят. но рулят на MS SQL, в мускуле же можно сделать рекурсию скорей всего, но сама реализация стореных процедур и функций гуано.
цитата
19/10/08 в 22:51
 Sterx
может немного неправильно объяснил
дерево такое: _http://phpclub.ru/detail/article/db_tree
pid а как такового нет
подсчет идет не прямых потомков, а потомков потомков (2 уровень вложенности)
дерево обсчитывается по кругу
цитата
19/10/08 в 23:24
 Pentarh
Говорю, дерево обходить это рекурсия нужна. Я не знаю, можно ли это сделать в стореной процедуре мускуля, но в пхп это где то так:
Код:

function dbcount($pid) {
$count=0;
$db->Select("SELECT pid FROM pids WHERE ref_pid=$pid");
while ($row=$db->fetch()) {
  $count+=dbcount($row['pid']);
}
$count+=$db->Select("SELECT count(*) FROM pids WHERE ref_pid=$pid");
return $count;
}

В MS SQL это было просто, там User-Defined Functions могли возвращать таблицу. Делаешь просто селект из функции, которая делает селект из самой себя по всем коленам да и все.
цитата
19/10/08 в 23:29
 Sterx
ну в принципе это тоже, что я и делаю сейчас
в несколько запросов, насколько я тебя понял
цитата
19/10/08 в 23:33
 Pentarh
Вроде программист а что такое рекурсия не знает icon_smile.gif

Рекурсия это когда функция вызывает сама себя до определенного условия. В твоем случае условие - плюсовать пока не закончатся потомки на текущем уровне.

function count_children($foobar) {
...
return count_children($barfoo);
}


Эта страница в полной версии