MySQL - рекурсивная древовидная структура - PullRequest
9 голосов
/ 04 марта 2010

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

location (<id>, ....)
location_parent (<location_id>, <parent_id>)

Вот MySQL / PHP для углубления в один:

$sql = "SELECT id FROM se_locations_services WHERE parent_locationid IN
( SELECT location_id FROM se_locations_parent WHERE parent_id = '$locationid' )";

Как мне, с учетом родительского местоположения, получить все его потомки, независимо от их глубины, просто используя MySQL?

Ответы [ 4 ]

23 голосов
/ 04 марта 2010

На mysql.com есть красивая статья , в которой описываются различные способы управления иерархическими данными.Я думаю, что он дает полное решение вашего вопроса и показывает различные менее простые, но более быстрые подходы (например, Nested Sets).

1 голос
/ 04 марта 2010

MySQL не хватает встроенной поддержки иерархических функций, поэтому вам придется эмулировать их, используя переменные сеанса для сохранения состояния рекурсии.

См. Эту статью о том, как реализовать функцию:

0 голосов
/ 04 марта 2010

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

Можно сделать выборку с помощью таблицы [parent_id, child_id], но для этого требуется временная таблица, и я видел, что это сделано в DB2, а не в MySQL.

Проверьте эту статью для реализации на древовидных структурах, хранящихся в MySQL: http://articles.sitepoint.com/article/hierarchical-data-database/

0 голосов
/ 04 марта 2010

Гораздо лучший способ управления данными такого рода - использовать метод обхода дерева измененных предзаказов:

http://articles.sitepoint.com/article/hierarchical-data-database/2

НТН

ш: //

...