在表格中查找每个类别的深度

时间:2011-05-03 01:44:58

标签: mysql sql hierarchical-data

我有一个名为Categories的表,具有以下结构:

CREATE TABLE `Categories` (
    `CatID` int(11) NOT NULL AUTO_INCREMENT,
    `UserID` int(11) NOT NULL,
    `CatName` varchar(250) NOT NULL,
    `Parent` int(200) NOT NULL,
    PRIMARY KEY (`CatID`)
)

我正在寻找创建一个SQL语句来查找每个类别的深度,我无法想出这个。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题的根源在于您的数据库结构无意解决此问题。 如果我在你的位置,我会在两个单独的表中重构该表(解决方案称为Closure Tables)。

让我们假设您使用MySQL,<rant>与Linux一样,从未指定发行版的人不会意识到ubuntu不是唯一的发行版</rant>

CREATE TABLE Categories (
   node_id INT AUTO_INCREMENT PRIMARY KEY ,
   label VARCHAR(40) NOT NULL
);

CREATE TABLE Closure (
   ancestor INT NOT NULL,
   descendant INT NOT NULL,
   PRIMARY KEY (ancestor, descendant),
   FOREIGN KEY (ancestor) REFERENCES Nodes(node),
   FOREIGN KEY (descendant) REFERENCES Nodes(node)
);

SELECT count( Categories.node_id ) AS depth
FROM Closure AS Des
     JOIN Closure AS Anc ON (Anc.descendant = Des.descendant)
     JOIN Categories ON ( Categories.node = Anc.ancestor)
WHERE Des.ancestor = 1 AND Des.descendant != Des.ancestor
GROUP BY Des.descendant;

这将计算每个节点的深度。我在这个设置中你实际上可以让每个子类别成为多个类别的后代。

您可以找到关于关闭表in this blog post的更多信息,或者自己看一本名为"SQL Antipatterns"的书。