В приведенном ниже запросе есть поле с именем main
, которое используется для различения категорий.
Итак, есть общие категории и основные категории, и оба они могут быть найдены в дереве. Поле main
- это просто тип и ничего с древовидной структурой, я имею в виду, это как поле состояния.
SELECT `c`.*,
(count(p.id)-1) AS `depth`
FROM `categories` AS `c`
CROSS JOIN `categories` AS `p`
WHERE (c.lft BETWEEN p.lft AND p.rht)
AND (c.root_id =p.root_id)
AND (p.main =1)
GROUP BY `c`.`id`
ORDER BY `c`.`root_id` ASC, `c`.`lft` ASC
Существует пункт where
, в котором указывается, что родительская категория должна быть главной. Кроме того, иногда мне нужно сделать select
, где родительская категория является общей категорией p.main =0
.
depth
- это позиция элемента в дереве. Так, если категория является дочерним элементом одного уровня другого, глубина будет 1
, если два уровня, глубина будет 2
.
Моя проблема в том, что когда я делаю выбор выше, если на дереве есть дети, отмеченные как общая категория, где отец является основной категорией (выбор p.main =1
), то общие категории depth
всегда равны 0
.
Другими словами, селектор работает правильно, если я выберу все категории, у которых верхний родительский элемент отмечен как main
, он отобразит дерево со всеми категориями, включая дочерние категории, отмеченные main=0
. Но в этом случае глубина всегда 0
Посмотреть результаты:
Категория 1423
является дочерним элементом 27
и не является основной категорией, но 27
есть, поэтому глубина 0
, но должна быть 1
. Категория 276
является дочерней по отношению к 64
, и обе являются основными категориями, поэтому она имеет правильную глубину.
Как я могу изменить этот запрос, чтобы поле depth
работало как положено?
Ссылка здесь: Как создать представление дерева из этого набора результатов на основе алгоритма обхода дерева?