需要一个mysql查询

时间:2009-12-12 05:56:00

标签: sql mysql

我有一个名为'role'的表

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

请帮帮我

3 个答案:

答案 0 :(得分:3)

使用:

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

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

答案 1 :(得分:1)

忽略给定示例中的数据不匹配这一事实,我认为您要做的是在数据库中存储和获取分层数据,最终您将获得一系列父母和子项。

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

最常见的方法是邻接列表模型,您可以选择第一条记录,然后选择它的父级,然后选择它的父级等,直到您拥有整个记录链。这是一种读取繁重的写入式方法,易于实现。

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

答案 2 :(得分: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