我拥有的:
给定一棵树(或更类似于有向图),描述系统如何由其通用部分组成。现在让这个系统例如人体及其身体部位的节点。
例如3
可能是有左叶和右叶的肝脏(6
and 9
),两者都有静脉(8
)(也可以在肝脏的任何未指定的位置找到,因此8
->3
)而且也在舌头上(5
)。肺(7
) - 位于胸部 (4
) - 还有一个右叶,依此类推...(好吧,当然肝脏中没有肺,而且还有一个6
->7
是合理的,所以这个例子不是最好的,但你明白了。)
所以我在数据库中有这些数据,如下所示:
table: part
+----+------------+ id is primary key
| id | name |
+----+------------+
| 1 | head |
| 2 | mouth |
| 3 | liver |
| 4 | chest |
| 5 | tongue |
| 6 | left lobe |
| 7 | lung |
| 8 | veins |
| 9 | right lobe |
+----+------------+
table: partpart
+-------+---------+ part&cont is primary key
| part | cont | part is foreign key for part.id
+-------+---------+ cont is foreign key for part.id
| 2 | 1 |
| 3 | 1 |
| 5 | 2 |
| 6 | 3 |
| 7 | 3 |
| 7 | 4 |
| 8 | 3 |
| 8 | 5 |
| 8 | 6 |
| 8 | 9 |
| 9 | 3 |
| 9 | 7 |
+-------+---------+
我想要实现的目标:
我想查询可以在部分中找到的所有部分3
并期待这样的结果:
result of query
+-------+---------+
| part | subpart |
+-------+---------+
| 3 | 6 |
| 3 | 7 |
| 3 | 8 |
| 3 | 9 |
| 6 | 8 |
| 7 | 9 |
| 9 | 8 |
+-------+---------+
我觉得以这种所需的格式获得结果是不可行的,但是将其作为类似的集合会很棒,因为我的目的是向用户显示数据,如下所示:
3
├─ 6
│ └─ 8
├─ 7
│ └─ 9
│ └─ 8
├─ 8
└─ 9
└─ 8
我如何尝试:
WITH RECURSIVE tree AS (
SELECT part.id as part, partpart.cont (..where to define subpart?)
FROM part JOIN partpart
ON part.id = partpart.part
WHERE part.id = 3
UNION ALL
SELECT part.id, partpart.cont
FROM (part JOIN partpart
ON part.id = partpart.part
), tree
WHERE partpart.cont = tree.part
)
SELECT part, subpart FROM tree
这是我能做的最接近的,但当然它不起作用。