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
Вроде программист а что такое рекурсия не знает
Рекурсия это когда функция вызывает сама себя до определенного условия. В твоем случае условие - плюсовать пока не закончатся потомки на текущем уровне.
function count_children($foobar) {
...
return count_children($barfoo);
}
Новая тема
Ответить
Эта страница в полной версии