MySQL Query Parent Child - PullRequest
       9

MySQL Query Parent Child

1 голос
/ 24 декабря 2010

Я работаю с mysql и php, и у меня есть таблица Parent Child, созданная в mysql. У каждого родителя есть 3 ребенка. Каждый ребенок становится также родителем и имеет 3 детей и т. Д.

Теперь мне нужно написать функцию, которая дает мне последний родительский элемент в дереве (в зависимости от идентификатора выбранного родителя), у которого нет 3 дочерних элементов. Таким образом, следующая родительская подписка может быть посвящена этому родителю.

Можно ли это сделать с помощью запроса или функции mysql?

Спасибо, M


Я использую следующий запрос:

SELECT t1.uid, t2.pid FROM cms_users AS t1 LEFT JOIN cms_users AS t2 ON t1.uid = t2.pid 

Что дает г-ну следующий вывод:

t1.uid t2.pid
1      1 
1      1 
1      1 
2      2 
2      2 
2      2 
3      3 
4      NULL 
5      NULL

Что мне действительно нужно, так это результат:

p1.uid p2.pid 
1      3 
2      3 
3      1 
4      0 
5      0 

Этот результат также начинается с корня Parent 1 Мне нужно получить результаты, начиная с выбранного uid где-то в трех. У каждого родителя свое дерево, начиная с его идентификатора. Возможно, мне нужно написать хранимую процедуру или что-то, но это все для меня в новинку, и я не знаю, как это сделать.

Это пример того, как выглядит дерево. http://www.musafreaks.com/images/tree.jpg У ID пользователя 1 есть свое дерево, даже у пользователей 2, 3 и 4 есть собственное дерево и так далее.

1 Ответ

2 голосов
/ 24 декабря 2010

Эту проблему нетривиально решить в MySQL.Несколько стратегий управления иерархическими данными описаны в руководстве .Остальная часть моего ответа основана на этой статье.

Ваша установка является своего рода «моделью списка смежности», поэтому вы можете адаптировать решение LEFT JOIN для своего набора данных.* Предполагается, что поле parent корневого узла равно null.Ваш возможный новый родитель будет выбран как t1.Обратите внимание, что этот запрос вернет все узлы, которые имеют нет дочерних элементов, если вы хотите «заполнить» каждый узел тремя дочерними элементами, вам придется немного расширить запрос.

...