2010-02-27 59 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,然后构建任何编程语言树你正在使用。