как грамотно выбрать дерево из БД?

Discussion in 'PHP' started by Дикс, 6 Feb 2009.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    PHP:
    SELECT *
    FROM `comments`
    WHERE `parent_id` = NULL
    OR `parent_idIN (
        
    SELECT `idFROM `commentsWHERE `parent_id` =NULL)
    AkyHa_MaTaTa
    ты и меня смутил. но я понял в чем суть.
    сначала вложенный запрос выбирает все комментарии первого уровня (как раз лимита на это я и не могу поставить)
    затем основной запрос выбирает опять комментарии первого уровня (где парент_ид НУЛЛ) - это кстати совсем лишнее И выбирает комментарии второго уровня, у которых парент_ид лежит в области тех ид, что выбраны в самом начале.

    убираем из основного запроса "WHERE `parent_id` = NULL", и каким-то образом добавляем лимит во вложенный запрос - вот то что необходимо для того, чтобы выбрать только нужные комменты и ВСЕ их подкомменты.
     
  2. oRb

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

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    581
    Reputations:
    256
    Дикс, если есть возможность изменить структуру таблицы, тогда советую почитать про nested sets. Этот метод очень хорош для выборки поддерева.
     
  3. Helios

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

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Если убрать проверку на `parent_id` = NULL из основного запроса, то ты получишь только комментырии второго уровня.

    Подзапрос не выбирает комментарии первого уровня, он только находит их идентификаторы, по которым мы выбираем комменты второго уровня.

    Как я понял, ты берешь на страницу N комментариев первого уровня и всех их потомков. В таком случае вижу два выхода:
    Первый из них - выбирать все и брать нужное средствами PHP, что совсем не айс. Потому метод отбрасываем.

    Второй - все таки разделить на два запроса:
    Code:
    SELECT * FROM `comments` WHERE `parent_id` = NULL AND `t` = '1' LIMIT 0,5
    
    Для выбора комментов первого уровня. Также сз полученных данных выбираешь id этих комментов и составляешь второй запрос:
    Code:
    SELECT * 
    FROM `comments` 
    WHERE `parent_id` IN ( $id_list )
    
    И уже отсюда выбираешь комменты второго уровня.

    Решение не из самых красивых, но это все же не рекурсия - влаживаем все в два запроса.
     
  4. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Этот метод действительно хорош для статичных деревьев, а дерево комментариев, очевидно, таким не является.
     
    1 person likes this.
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    http://forum.ixbt.com/topic.cgi?id=26:39140