[sql]Выборка открытых ветвей из NESTED SETS

Discussion in 'PHP' started by Doom123, 13 Apr 2012.

  1. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Привет ! У меня есть вопрос насчёт дерева NESTED SETS

    Вот пример дерева:

    [​IMG]
    + В моей таблице есть колонка `parent`

    У меня есть список открытых ветвей .. но он не непрерывный ... тоесть ветвь родитель может быть закрыта.

    Вот пример : id: (5,3,4,7) - Открытые ветви ... но ветвь родитель 5ой ветви(id = 5) не включена в данный список а значит закрыта(id=2).

    Мне нужно выбрать конкретные ветви id : (2,3,4) а также их непрерывные ответвления .. тоесть id : (6,7,12,13,14,8,9)

    но у меня ничего не выходит ...

    на выходе должны быть id : (2,3,6,7,12,13,14,8,4,9)
     
  2. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    у меня в базе хранится дерево сайтов / подсайтов

    я организовал Tree View на JQuery тоесть можно открывать ветки и смотреть подсайты у сайта ...
    но если обновить страницу все открытые ветки понятное дело закрываются..
    я решил хранить id открытых веток в Cookies .. id: (5,3,4,7) - открытые ветки ... то-есть Id (веток / сайтов) открытых и тем самых занесёных в cookies... теперь я хочу обработать эти id и выбрать их из БД для сохранения Tree View
     
  3. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    PHP берёт из кукисов открытые ветки и выводит на экран уже всё в открытов виде..
    но это не дело т.к это работает в цикле .. а я хотел это дело оптимизировать ..
    мне нужно выбрать запросом закрытые и открытые ветки и вывести всё это дело на экрн как и я написал выше ..

    вот как этосейчас работает .. примерно ..

    PHP:
    function print_tree($id false)
    {
        global 
    $wpdb;

        
    $ublogs user_blogs(); //Список ID блогов пользователя
        
    $IN '"' implode('","'$ublogs) . '"';

        if(isset(
    $_COOKIE['table_tree']) && !empty($_COOKIE['table_tree']))
            
    $opened explode(',',$_COOKIE['table_tree']);
        else 
    $opened = array();

        if(!
    $id)
        {

            
    $res $wpdb->get_results('SELECT `left_key`,`right_key`,`blog_id`,`level` FROM `wp_wnm_blogs_tree` 
                                                      WHERE `blog_id` IN ('
    .$IN.')
                                                  AND `level` = (SELECT `level` FROM `wp_wnm_blogs_tree`
                                                              WHERE `blog_id` IN ('
    .$IN.') 
                                                           ORDER BY `level` LIMIT 1)'
    );
            
        } else {
            
    $res $wpdb->get_results('SELECT `left_key`,`right_key`,`blog_id`,`level`
                                                       FROM `wp_wnm_blogs_tree` 
                                                       WHERE `parent` = "' 
    $id '" ORDER BY `id`');
        }

        foreach(
    $res as $blog)
        {
        
    //Выводим инфо о блоге

            
    if(in_array($blog->blog_id,$opened))
                
    print_tree($blog->blog_id);
        }
    }
    Вот так вот примерно всё работает .. но как видите запрос тут в цикле а это не есть гуд ..
    Как выбрать всё.. вместе с открытыми ветками одним-двумя запросами .. ?


    Зарание спасибо!