MySql中树结构的递归CTE(邻接列表)
我刚刚开始使用MySQL(我以前使用SQL Server)。我还没有开始在MySQL中实现任何东西,只是研究如何做事情以及可能遇到的问题 在SQLServer中,我使用CTE成功地通过邻接列表表结构递归,以生成所需的结果集。从MySQL到目前为止的情况来看,它不支持CTEs。我有一个相当简单的表结构来保存我的层次结构(以我熟悉的SQL Server语法b/c编写): 旁注:我意识到FullPathName和IsLeaf不是必需的,可以在查询时确定,但是插入树节点将是一种非常罕见的情况,而不是针对该表的查询-这就是为什么我计划在insert SP中计算这两个值的原因(将降低需要这两个值的查询的成本) 使用CTE(在SQL Server中),我可以使用如下函数查找当前节点的叶节点:MySql中树结构的递归CTE(邻接列表),mysql,sql,recursion,common-table-expression,Mysql,Sql,Recursion,Common Table Expression,我刚刚开始使用MySQL(我以前使用SQL Server)。我还没有开始在MySQL中实现任何东西,只是研究如何做事情以及可能遇到的问题 在SQLServer中,我使用CTE成功地通过邻接列表表结构递归,以生成所需的结果集。从MySQL到目前为止的情况来看,它不支持CTEs。我有一个相当简单的表结构来保存我的层次结构(以我熟悉的SQL Server语法b/c编写): 旁注:我意识到FullPathName和IsLeaf不是必需的,可以在查询时确定,但是插入树节点将是一种非常罕见的情况,而不是针对
CREATE FUNCTION fn_GetLeafNodesBelowNode (
@TreeNodeId int
)
RETURNS TABLE
AS
RETURN
WITH Tree (NodeId, Name, FullPathName, IsLeaf)
AS (
SELECT NodeId, Name, FullPathName, IsLeaf FROM TreeNodes WHERE NodeId = @TreeNodeId
UNION ALL
SELECT c.NodeId, c.Name, c.FullPathName, c.IsLeaf FROM Tree t
INNER JOIN TreeNodes c ON t.NodeId = c.ParentNodeId
)
SELECT * FROM Tree WHERE IsLeaf = 1
我将如何对MySQL进行同样的操作
提前感谢。您可以通过某种存储函数和位逻辑来完成 这是一个例子
试试看。您可以通过某种存储函数和位逻辑来完成 这是一个例子 试试看
CREATE FUNCTION fn_GetLeafNodesBelowNode (
@TreeNodeId int
)
RETURNS TABLE
AS
RETURN
WITH Tree (NodeId, Name, FullPathName, IsLeaf)
AS (
SELECT NodeId, Name, FullPathName, IsLeaf FROM TreeNodes WHERE NodeId = @TreeNodeId
UNION ALL
SELECT c.NodeId, c.Name, c.FullPathName, c.IsLeaf FROM Tree t
INNER JOIN TreeNodes c ON t.NodeId = c.ParentNodeId
)
SELECT * FROM Tree WHERE IsLeaf = 1