ФорумРазработкаБазы данных → Построение дерева, единственный выход?

Построение дерева, единственный выход?

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 28 июня 2015 г. 23:56

    Собственно строю дерево категорий функцией:

        function GetSections($TYP_ID, $PARENT, $LNG_ID){
            $SQL=tep_db_query('SELECT
                    STR_ID, TEX_TEXT AS STR_DES_TEXT, STR_ID_PARENT, STR_LEVEL, STR_SORT, STR_NODE_NR, 
                    IF(EXISTS(SELECT * FROM SEARCH_TREE AS SEARCH_TREE2 WHERE SEARCH_TREE2.STR_ID_PARENT <=> SEARCH_TREE.STR_ID LIMIT 1), 1, 0) AS DESCENDANTS
                FROM SEARCH_TREE
                    INNER JOIN DESIGNATIONS ON DES_ID = STR_DES_ID
                    INNER JOIN DES_TEXTS ON TEX_ID = DES_TEX_ID
                WHERE
                    STR_ID_PARENT <=> '.$PARENT.' AND
                    DES_LNG_ID = '.$LNG_ID.' AND
                    EXISTS (
                        SELECT * FROM LINK_GA_STR
                            INNER JOIN LINK_LA_TYP ON LAT_TYP_ID ='.$TYP_ID.' AND LAT_GA_ID = LGS_GA_ID
                            INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID
                        WHERE
                            LGS_STR_ID = STR_ID
                        LIMIT 1)
                ORDER BY STR_DES_TEXT');
            $result .= '<ul>';
            while($arPRes = tep_db_fetch_array($SQL)){ 
                $result .= '<li>' . $arPRes['STR_DES_TEXT'];
                if($arPRes['DESCENDANTS'] > 0) {
                    $result .= GetSections($TYP_ID, $arPRes['STR_ID'], $LNG_ID);
                }
                $result .= '</li>';
            }       
            $result .= '</ul>';
            return $result;
        }

    Это единственный выход? Есть варианты пооптимистичнее 134 запросов в базу на 9 секунд?

    Всего 4 уровня:

    На _exist.ua/cat/TecDoc/Cars/Audi/258/69300003 намного быстрее строит полное дерево.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 28 июня 2015 г. 23:59, спустя 2 минуты 15 секунд

    134 запросов в базу на 9 секунд

    @developer, збс. Ты переплюнул моего идеального дурачка, он был с Казахстана :)

    Сапожник без сапог
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 29 июня 2015 г. 0:10, спустя 1 минуту 48 секунд

    2015 год

    у них там в коде

    }}}}}}
  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 29 июня 2015 г. 0:13, спустя 3 минуты 55 секунд

    я вроде как и понимаю, что удобнее и быстрее всего было бы выгрузить все данные в массив и делать выборку из него, но как составить запрос не мае клепок

  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 29 июня 2015 г. 0:19, спустя 5 минут 8 секунд

    а ну кто сможет выбрать дерево за один запрос ?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 июня 2015 г. 0:20, спустя 1 минуту 9 секунд

    а ну кто сможет выбрать дерево за один запрос ?

    @kostyl, ебанулся? рекуосивное дерев в принципе нереально выбрать не рекурсие. тут вопрос в другом)

    Сапожник без сапог
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 29 июня 2015 г. 0:26, спустя 6 минут 1 секунду

    @phpdude, ну его четырёхуровнево дерево можно вытянуть за один запрос, мне кажется. Смотря из какой структуры вытягивать

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 29 июня 2015 г. 17:32, спустя 12 часов 2 минуты 3 секунды

    SELECT
           SEARCH_TREE.STR_LEVEL,
           ELT(SEARCH_TREE.STR_LEVEL, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT,
           ELT(SEARCH_TREE.STR_LEVEL, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID,
           SEARCH_TREE.STR_ID_PARENT AS STR_PARENT,
           ELT(SEARCH_TREE.STR_LEVEL-1, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT2,
           ELT(SEARCH_TREE.STR_LEVEL-1, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID2,
           ELT(SEARCH_TREE.STR_LEVEL-2, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT3,
           ELT(SEARCH_TREE.STR_LEVEL-2, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID3,
           ELT(SEARCH_TREE.STR_LEVEL-3, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT4,
           ELT(SEARCH_TREE.STR_LEVEL-3, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID4,
           ELT(SEARCH_TREE.STR_LEVEL-4, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT5,
           ELT(SEARCH_TREE.STR_LEVEL-4, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID5
            FROM
                      SEARCH_TREE
            LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = SEARCH_TREE.STR_DES_ID AND DESIGNATIONS.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE2 ON SEARCH_TREE2.STR_ID = SEARCH_TREE.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = SEARCH_TREE2.STR_DES_ID AND DESIGNATIONS2.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE3 ON SEARCH_TREE3.STR_ID = SEARCH_TREE2.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS3 ON DESIGNATIONS3.DES_ID = SEARCH_TREE3.STR_DES_ID AND DESIGNATIONS3.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS3 ON DES_TEXTS3.TEX_ID = DESIGNATIONS3.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE4 ON SEARCH_TREE4.STR_ID = SEARCH_TREE3.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS4 ON DESIGNATIONS4.DES_ID = SEARCH_TREE4.STR_DES_ID AND DESIGNATIONS4.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS4 ON DES_TEXTS4.TEX_ID = DESIGNATIONS4.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE5 ON SEARCH_TREE5.STR_ID = SEARCH_TREE4.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS5 ON DESIGNATIONS5.DES_ID = SEARCH_TREE5.STR_DES_ID AND DESIGNATIONS5.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS5 ON DES_TEXTS5.TEX_ID = DESIGNATIONS5.DES_TEX_ID

    Вот запрос для вывода полного списка категорий в базе, но как их связать с нужным мне $TYP_ID?

    Пробовал запрос:

    SELECT
           SEARCH_TREE.STR_LEVEL,
           ELT(SEARCH_TREE.STR_LEVEL, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT,
           ELT(SEARCH_TREE.STR_LEVEL, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID,
           SEARCH_TREE.STR_ID_PARENT AS STR_PARENT,
           ELT(SEARCH_TREE.STR_LEVEL-1, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT2,
           ELT(SEARCH_TREE.STR_LEVEL-1, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID2,
           ELT(SEARCH_TREE.STR_LEVEL-2, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT3,
           ELT(SEARCH_TREE.STR_LEVEL-2, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID3,
           ELT(SEARCH_TREE.STR_LEVEL-3, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT4,
           ELT(SEARCH_TREE.STR_LEVEL-3, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID4,
           ELT(SEARCH_TREE.STR_LEVEL-4, DES_TEXTS.TEX_TEXT, DES_TEXTS2.TEX_TEXT, DES_TEXTS3.TEX_TEXT, DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS STR_TEXT5,
           ELT(SEARCH_TREE.STR_LEVEL-4, SEARCH_TREE.STR_ID, SEARCH_TREE2.STR_ID, SEARCH_TREE3.STR_ID, SEARCH_TREE4.STR_ID, SEARCH_TREE5.STR_ID) AS STR_ID5
            FROM
                      SEARCH_TREE
            LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = SEARCH_TREE.STR_DES_ID AND DESIGNATIONS.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE2 ON SEARCH_TREE2.STR_ID = SEARCH_TREE.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = SEARCH_TREE2.STR_DES_ID AND DESIGNATIONS2.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE3 ON SEARCH_TREE3.STR_ID = SEARCH_TREE2.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS3 ON DESIGNATIONS3.DES_ID = SEARCH_TREE3.STR_DES_ID AND DESIGNATIONS3.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS3 ON DES_TEXTS3.TEX_ID = DESIGNATIONS3.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE4 ON SEARCH_TREE4.STR_ID = SEARCH_TREE3.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS4 ON DESIGNATIONS4.DES_ID = SEARCH_TREE4.STR_DES_ID AND DESIGNATIONS4.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS4 ON DES_TEXTS4.TEX_ID = DESIGNATIONS4.DES_TEX_ID
            LEFT JOIN SEARCH_TREE AS SEARCH_TREE5 ON SEARCH_TREE5.STR_ID = SEARCH_TREE4.STR_ID_PARENT
            LEFT JOIN DESIGNATIONS AS DESIGNATIONS5 ON DESIGNATIONS5.DES_ID = SEARCH_TREE5.STR_DES_ID AND DESIGNATIONS5.DES_LNG_ID = '.$LNG_ID.'
            LEFT JOIN DES_TEXTS AS DES_TEXTS5 ON DES_TEXTS5.TEX_ID = DESIGNATIONS5.DES_TEX_ID
            WHERE
                        EXISTS (
                        SELECT * FROM LINK_GA_STR
                            INNER JOIN LINK_LA_TYP ON LAT_TYP_ID ='.$TYP_ID.' AND LAT_GA_ID = LGS_GA_ID
                            INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID
                        WHERE
                            LGS_STR_ID = STR_ID
                        LIMIT 1)

    Вроде отсортировала, но все равно были категории которых быть не должно в сравнении с запросом из первого поста

  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 29 июня 2015 г. 17:37, спустя 4 минуты 34 секунды

    прикольный запрос))

    все умрут, а я изумруд
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 июня 2015 г. 17:44, спустя 6 минут 50 секунд

    ебушки

    Сапожник без сапог
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 29 июня 2015 г. 17:49, спустя 5 минут

    @developer, ты на приколе, тебе же написал Абырвалг как сделать, ёбушки-воробушки

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 29 июня 2015 г. 17:53, спустя 4 минуты 6 секунд

    я так и делаю, но мне нужно вытащить не весь список, а только отдельные категории которые относятся для данной модели авто, а запрос вытаскивает все подряд

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 июня 2015 г. 17:54, спустя 1 минуту 19 секунд

    прикольный запрос))

    @md5, таким запросом можно смело пикапить тёлок

    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!