我有一个名为'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
请帮帮我
答案 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