За последние 24 часа нас посетил 17371 программист и 1597 роботов. Сейчас ищут 980 программистов ...

Как в nestedset посчитать документы на каждом уровне, включа

Тема в разделе "Решения, алгоритмы", создана пользователем maxycwebber, 26 июн 2014.

  1. maxycwebber

    maxycwebber Новичок

    С нами с:
    25 мар 2014
    Сообщения:
    263
    Симпатии:
    11
    Адрес:
    Gdansk
    кроспост http://toster.ru/q/106347

    Задавался ли кто таким вопросом? Думаю ответы будут полезны не только мне.

    на текущий момент догадался лишь до такого

    Код (Text):
    1.  
    2. private function _getCount($root=true){
    3.         $criteria = new CDbCriteria();
    4.         $criteria->addCondition('parent_id IS '.($root ? '' : ' NOT ').' NULL');
    5.         $criteria->addCondition('category_id IN (
    6.                 SELECT
    7.                   id
    8.                 FROM
    9.                   forum_categories
    10.                 WHERE
    11.                   _left >= :left
    12.                   AND _right<= :right
    13.                   AND _root= :root)'
    14.         );
    15.         $criteria->params[':left']   =   $this->_left;
    16.         $criteria->params[':right']  =   $this->_right;
    17.         $criteria->params[':root']   =   $this->_root;
    18.  
    19.         return YiiForumPost::model()->count($criteria);
    20.     }
    21.  
    22.     public function getCountTopics(){
    23.         return $this->_getCount();
    24.     }
    25.     public function getCountPosts(){
    26.         return $this->_getCount(true);
    27.     }
    в данном примере в yii используется геттер countTopics(), countPosts()
    при вызове одного из них происходит выборка всех веток текущего корня. затем просто считаются все документы в этих ветках.

    при показе всего дерева, данный гетер будет вызываться в каждой строке, а это кол-во запросов равно кол-ву веток. что не очень хорошо )

    есть ли какие еще идеи?


    пока писал додумал денормализацию провести и хранить счетчики в доп поле категорий.