2009-12-12 205 views
1

我有一个名为“角色”需要一个MySQL查询

id | parent_id | name 
---+-----------+-------------------- 
1 | NULL  | Machine 
2 | 3   | Ram 
3 | 4   | Cpu 
4 | NULL  | Computer 
5 | NULL  | Electronic Device 

我需要一个(MySQL或postgress SQL)查询,这将给某个特定角色的可能父母表。

例如

'计算机' 的可能的父角色

id | name 
---+------------------- 
5 | Electronic Device 
1 | Machine 

请帮我

+2

似乎在提供的数据中没有逻辑关联。 –

+0

我不认为它可能在单个查询中 – Xinus

+0

@astander:我认为lintdavis想要问的是 - 他在同一张表中引用了记录,并且他希望列出在单个查询中给定特定记录的所有引用链 – Xinus

回答

3

用途:

SELECT t.id, 
     t.name 
    FROM ROLES t 
WHERE t.parent_id IS NULL 
    AND t.name != ? 

...其中?是什么name如果它的parent_id为空,则要排除它。

+2

这是在黑暗中的一枪? –

+3

null是parent_id的可能性,以便没有父母。 –

+0

可能有数百个空条目,其中“计算机”是一个。那应该不是自己的根? –

1

忽略你的例子中的数据不匹配的事实,我认为你要做的是在数据库中存储和获取分层数据,最终得到一系列父母和孩子。

存储和检索这种数据有几种方法。我强烈建议您阅读本文的Sitepoint文章:Storing Hierarchical Data in a Database

最常见的方法是邻接列表模型,您可以选择第一条记录,然后选择它的父项,然后选择它的父项等,直到获得整条记录链。这是一种阅读繁重的书写方式,并且易于实施。

如果你想要一个快速读取的方法,修改预置树遍历(第2页)是一个了不起的算法。实现起来更加困难,但是您可以在单个SELECT中选择整个子/父记录集。

1

根据其他用户的评论(可能缺乏完整的数据),它看起来像是一个自我参照表。因此,如果数据被修正,你可以尝试

select r2.* 
from role as r1 inner join 
role as r2 on r1.parent_id=r2.id 
where r1.name='Computer'; 

数据是

id | parent_id | name 
---+-----------+-------------------- 
1 | NULL  | Machine 
2 | 3   | Ram 
3 | 4   | Cpu 
4 | 1   | Computer 
5 | NULL  | Electronic Device