За последние 24 часа нас посетили 52037 программистов и 1763 робота. Сейчас ищут 895 программистов ...

Дерево категорий (parent_id)

Тема в разделе "MySQL", создана пользователем newnoob, 27 ноя 2008.

  1. newnoob

    newnoob Активный пользователь

    С нами с:
    8 авг 2006
    Сообщения:
    151
    Симпатии:
    0
    Проблема в том что в данный момент сначала выбираються родительские категории имеющие parent_id = 0, затем идет foreach и только потом от каждой идет запрос на parent_id = category_id, в итоге если на главной 12-15 категорий то это 20 запросов в лучшем случае, подскажите при такой реализации (см. ниже) реально ли сделать 1 запрос для выборки категории и её ПОД категорий? Услуга загрузки информации из интернет может помочь в этом вопросе. (Всегда были проблемы с этим буду очень благодарен за любую помощь).

    Функция контроллера:
    Код (Text):
    1.  
    2. $categories = $this->CBoard->findAllCategories($user_language, $limit, 0, 0, 0);
    3.  
    4. if(is_array($categories))
    5. {
    6.     foreach($categories as $key => $category)
    7.     {
    8.         echo 'Категория родитель: '.$category->trans_title.'  ';
    9.  
    10.         $parent_categories = $this->CBoard->findAllCategories($user_language, $parent_limit, 0, 0, $category->category_id);
    11.  
    12.         if(is_array($parent_categories))
    13.         {
    14.             foreach ($parent_categories as $parent_category)
    15.             {
    16.                 echo 'Подкатегория: '.$parent_category->trans_title.', ';
    17.             }
    18.         }
    19.     }
    20. }
    Функция из Active Record:

    Код (Text):
    1.  
    2. public function findAllCategories($language = '', $limit = 0, $offset = 0, $category_id = 0, $parent_id = 0)
    3. {
    4.     if($language)
    5.     {
    6.         $this->db->join('board_categories_trans', 'board_categories_trans.trans_category_fk = board_categories.category_id', 'left');
    7.  
    8.         $this->db->where('trans_language', $language);
    9.     }
    10.  
    11.     if($parent_id  >= 0)
    12.     {
    13.         $this->db->where('category_parentid', $parent_id);
    14.     }
    15.  
    16.     if($category_id > 0)
    17.     {
    18.         $this->db->order_by('category_id = '.$category_id, 'desc');
    19.     }
    20.  
    21.     $this->db->order_by('category_id', 'desc');
    22.  
    23.     if($limit > 0)
    24.     {
    25.         $this->db->limit($limit, $offset);
    26.     }
    27.  
    28.     $query = $this->db->get('board_categories');
    29.  
    30.     if($query->num_rows > 0)
    31.     {
    32.         return $query->result();
    33.     }
    34.     else
    35.     {
    36.         return FALSE;
    37.     }
    38. }
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    newnoob
    Защитникам ORM и AR - любуйтесь, как выглядит код простой выборки :lol:
    1. Если хранить в виде Nested Sets, то: SELECT * FROM table ORDER BY itemleft WHERE itemlevel<=2
    2. Допустим, выбрал все одним запросом, а как со своим AR разбирать по категориям-то собираешься?
     
  3. newnoob

    newnoob Активный пользователь

    С нами с:
    8 авг 2006
    Сообщения:
    151
    Симпатии:
    0
    За Nested Sets спасибо вроде то что нужно. Эт не мой AR, а CodeIgniter`а =) Второй вопрос не понял...

    p.s. Почитай доки там на вкус и цвет, мне удобнее писать запросы так, кому то достаточно и $this->db->query($sql); :)
    p.s.s. Можешь еще почитать смешные цитаты и немного расслабиться
     
  4. Mark32

    Mark32 Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2
    Nested Sets это лучший вариант, но чисто вопрос для интереса, это чего, апогей выборки данных из дерева? Может кто чего ещё производительнее и шустрее придумал?
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    это блин что?


    по сабжу - в простейших вариантах составляется список потомков узла и следующим запросом идет поиск их потомков. то есть кол-во запросов равняется уровню вложенности.
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1