如何在sql中的单个查询中获取类别和子类别? (MySQL的)

时间:2010-06-29 14:26:59

标签: sql mysql stored-procedures

我想知道是否可以在单个数据库提取中提取类别和子类别。

我的数据库表类似于下面显示的

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

可以使用存储过程和循环完成吗?如果是这样,它将是单个数据库提取还是多个?或者还有其他更好的方法吗?

谢谢!

3 个答案:

答案 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