2011-09-22 136 views
2

我刚刚开始使用MySQL(我以前使用过SQL Server)。我还没有开始在MySQL中实现任何东西,只是研究如何做事情和我可能遇到的问题。MySql中的递归CTE树结构(邻接列表)

在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?

在此先感谢。

回答

-1

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

Here就是一个例子。

试试看。