Я пытаюсь управлять поиском узла в таблице модели вложенного набора , но не через уникальный идентификатор, а через имя (строка) и другие узлы. внутри дерева у разных родителей можно назвать одинаково.
До сих пор я использовал уникальный идентификатор для получения узлов во вложенных наборах:
SELECT
node.name, node.lft, node.rgt
FROM tbl AS parent, tbl AS node
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.id = '{$node_id}'
GROUP BY node.id
Пытаясь расширить этот метод для более общего способа извлечения узла по его имени, я придумал запрос, содержащий столько же предложений HAVING, сколько и глубину извлекаемого узла, проверив имя узла и его глубину:
SELECT
node.name, node.lft, node.rgt, COUNT(node.id) AS depth
FROM tbl AS parent, tbl AS node
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.id
HAVING
(node.name = 'myParentName' AND depth = 1)
OR
(node.name = 'myParent2Name' AND depth = 2)
OR
...
# and so on
Но это не идеально: иметь два узла с одинаковым именем и одинаковой глубиной, но внутри разных родителей, оба извлекаются независимо от иерархии, к которой они принадлежат.
Пример:
ARTICLES
|
+--PHP
| +--the-origins
| +--syntax
+--JS
+--history
+--syntax
В этом случае приведенный выше запрос вернет либо ARTICLES / PHP / синтаксис, либо ARTICLES / JS / синтаксис: узел «синтаксис» с глубиной 3, в действительности, находится либо под узлом PHP, либо под узлом JS.
Есть ли эффективный путь, чтобы пройти, чтобы решить эту проблему?