Иерархическое соединение данных родительских / дочерних отношений в одной таблице - PullRequest
0 голосов
/ 16 мая 2011

У меня есть следующая таблица:

Id  ParentId  Weight
1   1         0
2   1         10
3   2         5

ParentId ссылки Id той же таблицы.Как я могу запросить эту таблицу, чтобы присоединить ее к себе, суммируя совокупный вес третьего столбца?

Например, если бы я хотел узнать совокупный вес Id 2, результат вернул бы 15(Id2 + Id3 = 15), поскольку родительский элемент элемента 3 равен 2. Если бы я хотел узнать совокупный вес элемента 3, он вернул бы 5, поскольку ни у одной записи нет родительского идентификатора элемента 3.

По сути, если у записи, к которой я запрашиваю, есть дочерний элемент, я хочу добавить последовательность дочерних элементов данных и вернуть один результат.

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

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Взгляните на эту статью .Если ваша таблица не обновляется часто, вы можете немного изменить их процедуру GenericTree, чтобы она генерировала все пути для всех строк (и вызывать ее каждый раз, когда вы вставляете запись в таблицу или обновляет столбец ParentId), сохраните эти данные вновая таблица, а затем вы можете выполнять все необходимые задачи, используя простые запросы.Лично я получаю следующую структуру таблицы:

CREATE TABLE `tree_for_my_table` (
`rootID` INT(11) NOT NULL, // root node id
`parentID` INT(11) NOT NULL, // current parent id
`childID` INT(11) NOT NULL, // child id (direct child of the parent)
`level` INT(11) NOT NULL, // how far child is from root
PRIMARY KEY (`rootID`, `parentID`, `childID`),
UNIQUE INDEX `childID` (`childID`, `level`)  
 )

Заполнение данных для этой таблицы не займет слишком много времени даже для довольно большого my_table.

0 голосов
/ 16 мая 2011

Вам нужно проиндексировать ваше дерево. См. Управление иерархическими данными в MySQL , чтобы узнать, как это сделать.

0 голосов
/ 16 мая 2011

Последнее, что я посмотрел, у mysql не было встроенного способа выполнения иерархических запросов, но вы всегда можете использовать методику, такую ​​как список смежности, обсуждаемую (среди других методик) в Управление иерархическими данными в MySQL , который кодирует иерархию в другой таблице и позволяет вам присоединиться к ней для извлечения поддеревьев в вашей иерархии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...