За последние 24 часа нас посетили 17050 программистов и 1629 роботов. Сейчас ищут 1385 программистов ...

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

Тема в разделе "MySQL", создана пользователем Fatal, 13 апр 2012.

  1. Fatal

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

    С нами с:
    28 июн 2008
    Сообщения:
    11
    Симпатии:
    0
    Привет ! У меня есть вопрос насчёт дерева 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. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    не понятны твои термины. с Nested Sets я знаком, с Adjacency List тоже. вот э фак из "открытая ветка"?
    какой-то колхозный Nested Set, IMHO
     
  3. Fatal

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

    С нами с:
    28 июн 2008
    Сообщения:
    11
    Симпатии:
    0
    извеняюсь , постораюсь обьеснить.

    у меня в базе хранится дерево сайтов / подсайтов

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

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    А при чем тут nested sets и бд тогда, если на jquery всё разворачивается? Куки хранят id открытых в jquery ветвей, осталось их сохранить. Проблема в чем?

    PS. Как человек формулирует мысли, так и программирует.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    воистину! но ругать сильно не стоит - мастерство приходит с опытом.
     
  6. Fatal

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

    С нами с:
    28 июн 2008
    Сообщения:
    11
    Симпатии:
    0
    не совесем всё так просто .. я уже всё написал и всё работает ... вопрос не в том .. вы меня судите не прочитав вопроса... у меня запрос из БД не оптимизирован .. работает в цикле ... т.к я не знаю как выбрать открытые ветки из БД я конечно благодарен за помощь но прочитайте вопрос пожалуста...

    PHP берёт из кукисов открытые ветки и выводит на экран уже всё в открытов виде..
    но это не дело т.к это работает в цикле .. а я хотел это дело оптимизировать ..
    мне нужно выбрать запросом закрытые и открытые ветки и вывести всё это дело на экрн как и я написал выше ..

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

    Код (Text):
    1.  
    2. function print_tree($id = false)
    3. {
    4.     global $wpdb;
    5.  
    6.     $ublogs = user_blogs(); //Список ID блогов пользователя
    7.     $IN = '"' . implode('","', $ublogs) . '"';
    8.  
    9.     if(isset($_COOKIE['table_tree']) && !empty($_COOKIE['table_tree']))
    10.         $opened = explode(',',$_COOKIE['table_tree']);
    11.     else $opened = array();
    12.  
    13.     if(!$id)
    14.     {
    15.  
    16.         $res = $wpdb->get_results('SELECT `left_key`,`right_key`,`blog_id`,`level` FROM `wp_wnm_blogs_tree`
    17.                                                   WHERE `blog_id` IN ('.$IN.')
    18.                                               AND `level` = (SELECT `level` FROM `wp_wnm_blogs_tree`
    19.                                                           WHERE `blog_id` IN ('.$IN.')
    20.                                                        ORDER BY `level` LIMIT 1)');
    21.        
    22.     } else {
    23.         $res = $wpdb->get_results('SELECT `left_key`,`right_key`,`blog_id`,`level`
    24.                                                    FROM `wp_wnm_blogs_tree`
    25.                                                    WHERE `parent` = "' . $id . '" ORDER BY `id`');
    26.     }
    27.  
    28.     foreach($res as $blog)
    29.     {
    30.     //Выводим инфо о блоге
    31.  
    32.         if(in_array($blog->blog_id,$opened))
    33.             print_tree($blog->blog_id);
    34.     }
    35. }
    Вот так вот примерно всё работает .. но как видите запрос тут в цикле а это не есть гуд ..
    Вот я и спросил вас уважаемых проффесионалов как выбрать всё.. вместе с открытыми деревьями одним-двумя запросами ..

    надеюсь зоть на этот раз нормально изложл.

    Зарание спасибо!
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.115
    Симпатии:
    1.244
    Адрес:
    там-сям
    интуиция подсказывает, что с Nested Sets можно одним махом:
    Код (Text):
    1.  
    2.     SELECT d.*
    3.     FROM
    4.       tree AS dd INNER JOIN
    5.       tree AS d ON dd.cleft BETWEEN d.cleft AND d.cright
    6.     WHERE
    7.       dd.id IN(:my_id_list)
    8.     ORDER BY d.cleft ASC