2010-02-27 61 views
6

我有父子關係,我想在遞歸查詢幫助臺分層數據在MySQL

表結構

roleId, roleName,  parentId 
1  Admin   0 
2  Backup Admin 1 
3  Office User 1 0 
4  User 1   3 
5  User 2   3 
6  Office User 2 0 
7  Off User 1  6 

我試圖進行遞歸查詢,但我不能做 請給我建議我該如何查詢數據庫 eg

Admin 
    -- Backup Admin 
    Office User 1 
    -- User 1 
    -- User 2 
    Office User 2 
    -- Off User 1 

回答

2

正如指出的上面,這不是真正的遞歸的,但如果你知道你需要多少步深去爲最大,你可以沿着這些路線使用的東西(也許用PHP生成查詢):

我首先將父ID設置爲NULL而不是0,但這是個人偏好。

SELECT * FROM table t1 
LEFT JOIN table t2 ON t2.parent_id = t1.role_id 
LEFT JOIN table t3 ON t3.parent_id = t2.role_id 
WHERE t1.parent_id IS NULL 

^^然而你需要深入這種情況。

[下位不嚴格相關]

然後你可以操縱沿着這些線路輸出的東西:

SELECT 
     (CASE 
     WHEN (t1.name IS NULL AND t2.name IS NULL) THEN t3.name 
     WHEN (t1.name IS NULL AND t2.name IS NOT NULL) THEN t2.name 
     ELSE t1.name END) AS first, 
     (CASE 
     WHEN (t1.name IS NOT NULL AND t2.name IS NOT NULL) THEN t2.name 
     WHEN (t2.name IS NULL AND t3.name IS NOT NULL) THEN NULL 
     ELSE t3.name END) AS second, 
     (CASE 
     WHEN (t1.name IS NOT NULL) THEN t3.name 
     ELSE NULL END) AS third 
FROM 
+0

編輯:你的問題的第二部分可能是不相關的,這只是將「最深」值分配到「第一」列。 – 2010-02-27 11:29:12

1

MySQL直接不支持遞歸查詢。

您需要通過編寫一個將遞歸堆棧保留在會話變量中的函數來模擬它。

看到這篇文章在我的博客上如何做到這一點:

2

查詢表一次,讓所有的名稱和ID,然後構建任何編程語言樹你正在使用。