我想知道是否可以在单个数据库提取中提取类别和子类别。
我的数据库表类似于下面显示的
表
cat_id parent_id
1 0
2 1
3 2
4 3
5 3
6 1
即。当输入为3时,则所有行的parent_id为3,行3本身和第3行的所有父项都应该被提取。
输出
cat_id parent_id
3 2 -> The row 3 itself
4 3 -> Row with parent as 3
5 3 -> Row with parent as 3
2 1 -> 2 is the parent of row 3
1 0 -> 1 is the parent of row 2
可以使用存储过程和循环完成吗?如果是这样,它将是单个数据库提取还是多个?或者还有其他更好的方法吗?
谢谢!
答案 0 :(得分:1)
如果你问“有没有mysql递归查询?”回答“不”。
但是有一个非常好的方法来处理它。
创建帮助表(说CatHierarchy)
CatHierarchy:
SuperId, ChildId, Distance
------------------------------
1 1 0
1 2 1
2 2 0
这个冗余数据允许在1个查询中轻松选择任何层次结构,并且在2个插入中支持任何层次结构(删除也在1个查询中执行,并借助删除级联完整性)。
那是什么意思呢。您跟踪层次结构中的所有路径。 Cat的每个节点必须添加对自身的引用(距离0),然后通过添加关于节点的冗余数据来支持复制。
要选择带有sub的类别,只需写入:
SELECT c.* from Category c inner join CatHierarchy ch ON ch.ChildId=c.cat_id
WHERE ch.SuperId = :someSpecifiedRootOfCat
someSpecifiedRootOfCat - 是指定类别根的参数 这就是全部!
答案 1 :(得分:0)
这是关于Sitepoint的一篇非常好的文章 - 特别是Modified Preorder Tree Traversal
答案 2 :(得分:-1)
这很棘手。我假设你想要显示类别,有点像文件夹视图?三个字段:MainID,ParentID,Name ...应用到您的表中,它应该像魅力一样工作。我认为它被称为递归查询?
WITH CATEGORYVIEW (catid, parentid, categoryname) AS
(
SELECT catid, ParentID, cast(categoryname as varchar(255))
FROM [CATEGORIES]
WHERE isnull(ParentID,0) = 0
UNION ALL
SELECT C.catid, C.ParentID, cast(CATEGORYVIEW.categoryname+'/'+C.categoryname as varchar(255))
FROM [CATEGORIES] C
JOIN CATEGORYVIEW ON CATEGORYVIEW.catID = C.ParentID
)
SELECT * FROM CATEGORYVIEW ORDER BY CATEGORYNAME