Рекурсивный SQL в той же таблице для поиска родителя

Как я могу найти parentId всех моих элементов (mySQL)? (потенциально существует бесконечное количество уровней иерархии... не лучший дизайн, но это то, с чем я работаю)

ID      PARENTID    NAME
9146    NULL        thing1
9147    NULL        thing2
9148    9146        thing3
9149    9148        thing4
9150    NULL        thing5
9151    9149        thing6
9152    9147        thing7

Результат должен быть таким:

ID     REAL_PARENTID
9146   NULL (or self 9146)
9147   NULL (or self 9147)
9148   9146
9149   9146
9150   NULL (or self 9150)
9151   9146
9152   9147

person monkey-wrench    schedule 16.02.2012    source источник
comment
Вам нужно подняться до верхнего родителя или до родителя, занимающего первое место в иерархии? Неважно, я вижу, тебе нужно добраться до вершины.   -  person BD.    schedule 16.02.2012
comment
Ответ на этот вопрос: stackoverflow.com/questions/3704130/recursive-mysql-query должен быть использовать для вас.   -  person    schedule 16.02.2012
comment
Ваш пример не ясен. Судя по опубликованным данным, вы ищете просто SELECT ID, PARENTID из таблицы, вот и все. В чем проблема ?   -  person Marc Alff    schedule 16.02.2012
comment
@Marc Не совсем так, посмотрите на идентификаторы элементов 9149 и 9151. REAL_PARENTID отличается   -  person monkey-wrench    schedule 16.02.2012
comment
О, пропустил. Спасибо за разъяснения.   -  person Marc Alff    schedule 16.02.2012
comment
@monkey-wrench можете ли вы спроектировать его таким образом, чтобы при вставке любого дочернего элемента первого уровня он находил своего последнего предка и сохранял его в столбце oldest parent? Таким образом, для любой последующей вставки дочерних элементов вы можете просто найти их непосредственного родителя и скопировать их столбец oldest parent.   -  person cctan    schedule 17.02.2012


Ответы (2)


На самом деле я написал сценарий обхода дерева, используя программирование хранимых процедур MySQL.

Я ответил на такой вопрос в DBA StackExchange еще 24 октября 2011 г.. Он также включал образцы данных.

Получайте удовольствие от этого.

person RolandoMySQLDBA    schedule 16.02.2012

Вы можете легко сделать это, используя таблицы SQL CTE (рекурсивные запросы).

Проверьте это, чтобы узнать, как это сделать:

http://msdn.microsoft.com/en-us/library/ms186243.aspx

person Ali Issa    schedule 16.02.2012
comment
Это mysql... :) stackoverflow.com/questions/1382573/ - person Asken; 16.02.2012