MySQL:获取所有子类别,后代

时间:2009-11-06 22:19:27

标签: mysql

我将mysql表定义为:

类别:category_id,category_name,parent_category_id

我正在寻找一个很好的SQL查询来检索给定category_id的所有DESCENDANTS。这意味着,它的孩子和孩子的孩子。

如果这有帮助,我们可以假设最大数量的等级(3)。此查询可以在任何级别(根,级别2,级别3)发送。

谢谢!

4 个答案:

答案 0 :(得分:5)

有几种方法可以在数据库中存储树。在sitepoint上有一篇很棒的文章描述了所有的技术:

http://articles.sitepoint.com/article/hierarchical-data-database/2

如果您希望能够在一个查询中获取树的整个部分,那么最合适的是修改预订树遍历。

此技术也称为嵌套集。如果您想了解更多有关该主题的文献,请点击此处了解更多信息:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

答案 1 :(得分:2)

可以在单个查询和一段递归后端代码逻辑中完成:Formatting a multi-level menu using only one query

如果您同时执行PHP,则本文附带PHP示例作为奖励,但翻译为其他语言并不难。由于你没有提到你正在使用的服务器端语言,所以我无法给出任何提示。

希望这有帮助。

答案 2 :(得分:1)

如果您想使用最多3个级别的此结构,您可以将表连接到自身三次:

SELECT 
    c1.id AS level_1, 
    c2.id AS level_2, 
    c3.id AS level_3
FROM categories c1
LEFT JOIN categories c2 ON c1.id = c2.parent_id
LEFT JOIN categories c3 ON c2.id = c3.parent_id
WHERE c1.parent_id IS NULL

我假设父类别在parent_id中为NULL。

一些例子:

DECLARE @categories TABLE 
(
    id INT,
    parent_id INT
)

INSERT INTO @categories(id,parent_id) VALUES(1,NULL)
INSERT INTO @categories(id,parent_id) VALUES(4,1)
INSERT INTO @categories(id,parent_id) VALUES(5,1)
INSERT INTO @categories(id,parent_id) VALUES(6,5)
INSERT INTO @categories(id,parent_id) VALUES(2,NULL)

SELECT * FROM @categories

SELECT c1.id AS level_1, c2.id AS level_2, 
    c3.id AS level_3
FROM @categories c1
LEFT JOIN @categories c2 ON c1.id = c2.parent_id
LEFT JOIN @categories c3 ON c2.id = c3.parent_id
WHERE c1.parent_id IS NULL

返回:

level_1 | level_2 | level_3
---------------------------
1       | 4       | NULL
1       | 5       | 6
2       | NULL    | NULL

答案 3 :(得分:0)

MySQL不支持递归查询,但您可以使用带有WHILE循环的存储过程查找所有后代。请参阅此book sampleThe edge list部分。