2011-09-22 143 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就是一個例子。

試試看。