我将mysql表定义为:
类别:category_id,category_name,parent_category_id
我正在寻找一个很好的SQL查询来检索给定category_id的所有DESCENDANTS。这意味着,它的孩子和孩子的孩子。
如果这有帮助,我们可以假设最大数量的等级(3)。此查询可以在任何级别(根,级别2,级别3)发送。
谢谢!
森
答案 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 sample的The edge list
部分。