Как получить результат structed с помощью вложенного набора в MySQL и PHP?

Нет никакого ограничения на глубину.

Как получить структурированное ответвление или даже все дерево?

Определение отсюда: Управление Иерархическими Данными в MySQL

11
задан Paŭlo Ebermann 21 August 2011 в 23:09
поделиться

4 ответа

Даже если структура данных на стороне mysql несколько экзотична, данные все равно извлекаются с использованием обычных методов запроса. Выполните соответствующий оператор выбора, переберите результаты и поместите их в массив PHP. Хотя я не знаю, зачем вам это нужно, поскольку в PHP было бы намного сложнее выполнять операции с наборами, чем в MySQL.

0
ответ дан 3 December 2019 в 11:03
поделиться

Я использую похожий, но не совсем такой же подход, который также сохраняет ссылку на родителя в дочернем элементе; это упрощает построение древовидной структуры из данных. Если это полезно, я могу опубликовать код для извлечения данных в дерево на PHP.

@Marc, описанная структура данных не обязательно для выполнения операций над наборами; это просто упрощает работу со структурой. Если вы хотите получить все дерево данных, и каждая запись просто хранит указатель на родительскую запись, вам необходимо рекурсивно запросить базу данных, чтобы получить полное дерево данных. Если вы воспользуетесь описанным там подходом, то сможете извлечь весь набор за один запрос.

Правка: вот код, который строит древовидную структуру, ЕСЛИ вы поддерживаете дочернюю -> родительскую ссылку, а также элементы lft / right. Я предпочитаю делать это, потому что на самом деле это еще быстрее, если вы хотите получить только прямых потомков одного уровня дерева.

Я попытался убрать его, чтобы продемонстрировать основы, поэтому могут быть некоторые опечатки и т. Д., Но вы должны уловить идею. Ключевые части:

  • Упорядочивайте свой запрос по "lft ASC", таким образом вы всегда будете обрабатывать родительский узел раньше его дочерних.
  • Сохранение ссылки на каждый узел по идентификатору; таким образом любой дочерний элемент этого узла может легко найти его и добавить себя к родительскому.
  • Просмотрите результаты, сохраните ссылку для каждого по идентификатору (как указано выше) и добавьте этот узел к дочерним элементам его родителя.

В любом случае, вот код -

<?php
$children = mysql_query('SELECT * FROM nested_category ORDER BY lft ASC');

/* Get the first child; because the query was ordered by lft ASC, this is
   the "root" of the tree */
$child          = mysql_fetch_object($children);
$root           = new StdClass;
$root->id       = $child->folderID;
$root->children = array();
/* Store a reference to the object by the id, so that children can add
   themselves to it when we come across them */
$objects        = array($root->id => $root);

/* Build a tree structure */
while ($child = mysql_fetch_object($children)) {
    /* Create a new wrapper for the data */
    $obj           = new StdClass;
    $obj->id       = $child->id;
    $obj->children = array();
    /* Append the child to the parent children */
    $parent = $objects[$child->parent];
    $parent->children[] = $obj;
    $objects[$obj->id] = $obj;
}   
2
ответ дан 3 December 2019 в 11:03
поделиться

Глядя на вашу ссылку, я бы сделал это с помощью Left Joins. Посмотрите на пример получения полного дерева.

ВЫБРАТЬ t1.name как lev1, t2.name как lev2, t3.name как lev3, t4.name как lev4 ИЗ категории как t1 ЛЕВОЕ СОЕДИНЕНИЕ к категории как t2 НА t2.parent = t1.category_id ЛЕВАЯ категория СОЕДИНЕНИЯ КАК t3 НА t3.parent = t2.category_id ЛЕВАЯ категория СОЕДИНЕНИЯ КАК t4 НА t4.parent = t3.category_id ГДЕ t1.name = 'ELECTRONICS';

Вам понадобится ЛЕВОЕ СОЕДИНЕНИЕ для каждого иерархического уровня, который вы хотите включить. Затем результат может быть преобразован php в любую желаемую структуру данных. Просто игнорируйте результаты NULL .

| ЭЛЕКТРОНИКА | ТЕЛЕВИДЕНИЯ | ТРУБКА | NULL |

| ЭЛЕКТРОНИКА | ТЕЛЕВИДЕНИЯ | ЖК-дисплей | NULL |

| ЭЛЕКТРОНИКА | ТЕЛЕВИДЕНИЯ | ПЛАЗМА | NULL |

| ЭЛЕКТРОНИКА | ПОРТАТИВНАЯ ТЕХНИКА | MP3-ПЛЕЕРЫ | ВСПЫШКА |

| ЭЛЕКТРОНИКА | ПОРТАТИВНАЯ ТЕХНИКА | CD-ПРОИГРЫВАТЕЛИ | NULL |

| ЭЛЕКТРОНИКА | ПОРТАТИВНАЯ ТЕХНИКА | ДВУХСТОРОННЕЕ РАДИО | NULL |

Если у вас есть глубокая структура, это будет худший метод, потому что MySQL Joins требует много времени для выполнения, когда нужно объединить много таблиц.

Надеюсь, я правильно понял ваш вопрос.

0
ответ дан 3 December 2019 в 11:03
поделиться

Я должен сообщить вам о методе, с помощью которого вы можете работать с древовидными структурами, используя php .. без рекурсии. Я думаю, вы очень хорошо знакомы со стандартной библиотекой php (SPL). Вы можете использовать итераторы для своего вопроса.

http://www.php.net/~helly/php/ext/spl/

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

Для: - Модель списка смежности

Вы можете использовать "RecursiveIteratorIterator", который покажет все результаты, включая всех детей.

Если вы хотите показать только детям. вы можете использовать "ParentIterator"

0
ответ дан 3 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: