Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql中树结构的递归CTE(邻接列表)_Mysql_Sql_Recursion_Common Table Expression - Fatal编程技术网

MySql中树结构的递归CTE(邻接列表)

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不是必需的,可以在查询时确定,但是插入树节点将是一种非常罕见的情况,而不是针对

我刚刚开始使用MySQL(我以前使用SQL Server)。我还没有开始在MySQL中实现任何东西,只是研究如何做事情以及可能遇到的问题

在SQLServer中,我使用CTE成功地通过邻接列表表结构递归,以生成所需的结果集。从MySQL到目前为止的情况来看,它不支持CTEs。我有一个相当简单的表结构来保存我的层次结构(以我熟悉的SQL Server语法b/c编写):

旁注:我意识到FullPathName和IsLeaf不是必需的,可以在查询时确定,但是插入树节点将是一种非常罕见的情况,而不是针对该表的查询-这就是为什么我计划在insert SP中计算这两个值的原因(将降低需要这两个值的查询的成本)

使用CTE(在SQL Server中),我可以使用如下函数查找当前节点的叶节点:

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