【问题标题】:Recursive CTE in MySql for tree structure (adjacency list)MySql中用于树结构的递归CTE(邻接表)
【发布时间】:2011-11-23 00:04:17
【问题描述】:

我刚开始使用 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 不是必需的,可以在查询时确定,但是与针对此的查询相反,插入树节点的情况非常罕见表 - 这就是为什么我计划计算这两个值作为插入 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 做同样的事情?

提前致谢。

【问题讨论】:

    标签: mysql sql recursion common-table-expression


    【解决方案1】:

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

    Here 就是一个例子。

    试一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多