Как изменить этот CROSS JOIN SQL, созданный для обхода дерева (вложенный набор)? - PullRequest
0 голосов
/ 06 декабря 2010

В приведенном ниже запросе есть поле с именем 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

Посмотреть результаты:

alt text

Категория 1423 является дочерним элементом 27 и не является основной категорией, но 27 есть, поэтому глубина 0, но должна быть 1. Категория 276 является дочерней по отношению к 64, и обе являются основными категориями, поэтому она имеет правильную глубину.

Как я могу изменить этот запрос, чтобы поле depth работало как положено?

Ссылка здесь: Как создать представление дерева из этого набора результатов на основе алгоритма обхода дерева?

1 Ответ

0 голосов
/ 06 декабря 2010

Вы на самом деле говорите, что ищете этот счетчик, но только для узлов, являющихся потомками основного родителя.Если это именно то, что вам действительно нужно, тогда ваш запрос является более неправильным, чем просто исправление этого - таблица, которую вы называете «p» и, кажется, считаете «родительской» таблицей, фактически является « предком » таблицей - аналогично »с 'не ребенок, но' потомок '.Вы заканчиваете тем, что подсчитали main помеченных предков всех узлов в дереве.

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