我有一个名为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语句来查找每个类别的深度,我无法想出这个。任何帮助将不胜感激。
答案 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"的书。