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

时间:2011-09-22 16:17:17

标签: mysql sql recursion common-table-expression

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

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

CREATE TABLE TreeNodes (
    NodeId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    ParentNodeId int NULL,
    Name varchar(50) NOT NULL,
    FullPathName varchar(MAX) NOT NULL,  -- '/' delimited names from root to current node
    IsLeaf bit NOT NULL  -- is this node a leaf?
)

旁注:我意识到FullPathName和IsLeaf不是必需的,可以在查询时确定,但是树节点的插入将是一个非常罕见的事件,而不是对此的查询table - 这就是为什么我计划将这两个值计算为插入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做同样的事情?

提前致谢。

1 个答案:

答案 0 :(得分:-1)

你可以通过某种存储函数和位逻辑来完成它。

Here就是一个例子。

试一试。