如何在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
可以这样使用存储过程和循环来完成?如果是这样,它会是一个单一的数据库读取或多个?或者还有其他更好的方法吗?
谢谢!
答
如果你问“是否有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 - 是参数指定 类的根多数民众赞成!
答
这是棘手。我假设你想显示类别,有点像文件夹视图?三个字段: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
这里是一些写着:http://dev.mysql.com/tech-resources/articles/hierarchical-data.html 在MySQL中,这是一个很难受...... – 2010-06-29 14:45:43
感谢队友。好的文章确实!那么,我遵循相邻的模型!?嗯...但由于关卡可能会有所不同(表格中可能出现动态条目),我仍然不确定如何实施它。还在想.... – user355562 2010-06-29 15:32:00
2天后仍然卡住! :(不满意的结果!!! – user355562 2010-07-01 16:15:11