Как получить категории детей без детей из этих категорий? - PullRequest
1 голос
/ 18 сентября 2009

Вот мое утверждение:

SELECT (
  COUNT( parent.categoryName ) - ( sub_tree.depth +1 ) ) AS depth,
  CONCAT( REPEAT( '', ( COUNT( parent.categoryName ) - ( sub_tree.depth +1 ) ) ) , node.categoryName ) AS categoryName

FROM 
  Categories AS node,
  Categories AS parent,
  Categories AS sub_parent,
 (
  SELECT node.categoryName, (
     COUNT( parent.categoryName ) -1) AS depth
     FROM 
       Categories AS node,
       Categories AS parent
     WHERE 
       node.categoryLft BETWEEN parent.categoryLft AND parent.categoryRgt
   AND node.categoryName LIKE 'Product'

     GROUP BY node.categoryName
     ORDER BY node.categoryLft
  ) AS sub_tree
WHERE 
    node.categoryLft BETWEEN parent.categoryLft AND parent.categoryRgt
AND node.categoryLft BETWEEN sub_parent.categoryLft AND sub_parent.categoryRgt
AND sub_parent.categoryName = sub_tree.categoryName

GROUP BY node.categoryName
ORDER BY node.categoryLft

Это прекрасно работает, но мне бы хотелось изменить его, чтобы получить только первые узлы рядом с выбранной категорией (здесь «Продукты») без дочерних элементов подкатегорий

Нравится: Продукты:

  • TypeA

    • SubTypeA

    • SubTypeB

  • TypeB

Я хочу получить 'TypeA', 'TypeB'.

Кстати, вот мой стол:

CREATE TABLE `Categories` (
 `categoryId` int(11) NOT NULL auto_increment,
 `categoryLft` int(11) NOT NULL,
 `categoryRgt` int(11) NOT NULL,
 `categoryName` varchar(255) default NULL,
 `categoryAlias` varchar(255) default NULL,
 PRIMARY KEY  (`categoryId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

1 Ответ

1 голос
/ 18 сентября 2009
SELECT  child.*
FROM    categories parent
JOIN    categories child
ON      child.categoryLft BETWEEN parent.categoryLft AND parent.categoryRgt
WHERE   parent.id = @id_of_products
        AND NOT EXISTS
        (
        SELECT  NULL
        FROM    categories grandchild
        WHERE   grandchild.categoryLft BETWEEN child.categoryLft AND child.categoryRgt
        )

Nested sets используемая вами модель очень сложная в управлении.

Вы можете прочитать эту статью в моем блоге:

, который описывает, как реализовать гораздо более простую adjacency list модель в MySQL.

...