programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 19/10/08 в 20:27 |
основная таблица БД - древовидная структура
можно как то посчитать количество элементов в ветках (подкатегориях) в одном запросе.
пока получется так, что обхожу все дерево, выдергивая id узлов
потом перебирая в массиве делаю COUNT(*) каждой ветки.
ну плюс еще по некоторым полям идет WHERE
есть менее ресурсоемкий путь?
|
|
|
|
С нами с 03.05.07
Сообщения: 801
Рейтинг: 825
|
Добавлено: 19/10/08 в 20:50 |
Так может у тебя неправильная структура. Любое дерево любой вложенности можно записать ввиде полей id и pid. Где id - номер записи, pid - номер родительской записи. А посчитать это элементарно с помощью COUNT(*) ... GROUP BY pid
|
|
|
|
Гражданин планеты Земля
С нами с 30.03.03
Сообщения: 7217
Рейтинг: 2185
|
Добавлено: 19/10/08 в 21:11 |
SELECT DISTINCT `id`, COUNT(`какое-нить поле ветки`) FROM .... GROUP BY `id`
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 19/10/08 в 21:32 |
рекурсивные стореные процедуры, функции рулят. но рулят на MS SQL, в мускуле же можно сделать рекурсию скорей всего, но сама реализация стореных процедур и функций гуано.
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 19/10/08 в 22:51 |
может немного неправильно объяснил
дерево такое: _http://phpclub.ru/detail/article/db_tree
pid а как такового нет
подсчет идет не прямых потомков, а потомков потомков (2 уровень вложенности)
дерево обсчитывается по кругу
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 19/10/08 в 23:24 |
Говорю, дерево обходить это рекурсия нужна. Я не знаю, можно ли это сделать в стореной процедуре мускуля, но в пхп это где то так:
Код: |
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 могли возвращать таблицу. Делаешь просто селект из функции, которая делает селект из самой себя по всем коленам да и все.
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 19/10/08 в 23:29 |
ну в принципе это тоже, что я и делаю сейчас
в несколько запросов, насколько я тебя понял
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 19/10/08 в 23:33 |
Вроде программист а что такое рекурсия не знает
Рекурсия это когда функция вызывает сама себя до определенного условия. В твоем случае условие - плюсовать пока не закончатся потомки на текущем уровне.
function count_children($foobar) {
...
return count_children($barfoo);
}
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |