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

问题描述:

我想知道是否可以在单个数据库提取中提取类别和子类别。如何在sql中的单个查询中获取类别和子类别? (mysql)

我的数据库表类似于下面

表所示东西

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 

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

谢谢!

+1

这里是一些写着:http://dev.mysql.com/tech-resources/articles/hierarchical-data.html 在MySQL中,这是一个很难受...... – 2010-06-29 14:45:43

+0

感谢队友。好的文章确实!那么,我遵循相邻的模型!?嗯...但由于关卡可能会有所不同(表格中可能出现动态条目),我仍然不确定如何实施它。还在想.... – user355562 2010-06-29 15:32:00

+0

2天后仍然卡住! :(不满意的结果!!! – user355562 2010-07-01 16:15:11

如果你问“是否有mysql递归查询?”回答“否”。

但有很好的方法来处理它。

创建辅助表(说CatHierarchy)

CatHierarchy: 
    SuperId, ChildId, Distance 
------------------------------ 
    1   1   0 
    1   2   1 
    2   2   0 

这种冗余数据容易允许1个查询选择任何层次结构,并在2插入支持任何层次(缺失也在1个查询与删除级联的帮助下进行完整性)。

那么这是什么意思。您可以跟踪层级中的所有路径。 Cat的每个节点必须添加对自身的引用(距离0),然后通过添加有关节点的冗余数据来支持复制。

要选择与子类别只写:

SELECT c.* from Category c inner join CatHierarchy ch ON ch.ChildId=c.cat_id 
     WHERE ch.SuperId = :someSpecifiedRootOfCat 

someSpecifiedRootOfCat - 是参数指定 类的根多数民众赞成!

有专门关于这对Sitepoint一个真正的好文章 - 看起来特别是在Modified Preorder Tree Traversal

这是棘手。我假设你想显示类别,有点像文件夹视图?三个字段: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