2009-09-18 4 views
1

Вот мое заявление:Как получить категории детей без детей из них?

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 
+0

Вопрос только в том, действительно ли нужен такой сложный механизм категоризации? Если это не я могу предоставить вам простой и достаточный для каждой таблицы категорий задач и запросов. –

+0

Он будет использоваться для категоризации любых типов вещей, и у меня нет никаких идей о том, как будут выглядеть категории, у меня есть только одно правило: «категория может иметь много подкатегорий». Он будет использоваться для централизации категорий независимо от категоризированных объектов. (Это могут пользователи, статьи, продукты и т. Д.) Но я все еще открыт для любых новых хороших идей ... –

ответ

1
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.