2

私はこのアルゴリズムを使い始めたばかりですが、本当に素晴らしい方法です。私が立ち往生している唯一のことは、たとえば、ツリーの深さ n レベルのみを取得する方法です...

ツリー トラバーサル

Img src = http://www.sitepoint.com/hierarchical-data-database-2/ (素晴らしい記事)

上の図で、Food のすべての子を選択する方法を教えてください。

疑似コードでの回答のみが必要ですが、必要に応じて MySQL で回答することもできます。

現在の SQL クエリは次のようになります。

SELECT `treeItems`.`ID` AS `treeItemsID`, `treeItems`.`parent`, `treeItems`.`type`

FROM 
       `treeItems`,
       (
           SELECT `lft`, `rgt` FROM `treeItems` WHERE `ID` = $parent

       ) AS `parentRow`

WHERE  `treeItems`.`lft` > `parentRow`.`lft` AND `treeItems`.`lft` < `parentRow`.`rgt`
4

1 に答える 1

3

SO: Modified preorder tree traversal: Selecting nodes 1 level deepで別の同様の質問を見つけました。これは解決に役立ちました。

そこで、SQL を次のように変更しました。

SELECT `treeItems`.*, (COUNT(`depthJoin`.`ID`) - 1) AS `depth`
FROM   `treeItems`,

       (
       SELECT `lft`, `rgt` FROM `treeItems` WHERE `ID` = $parent

       ) AS `parentRow`

CROSS JOIN `treeItems` AS `depthJoin`

WHERE (`treeItems`.`lft` BETWEEN `depthJoin`.`lft` AND `depthJoin`.`rgt`)
AND   (`treeItems`.`lft` > `parentRow`.`lft` AND `treeItems`.`lft` < `parentRow`.`rgt`)

GROUP BY `treeItems`.`ID`
HAVING `depth` <= $maxDepth
于 2012-08-28T12:55:56.290 に答える