我有一张桌子:
Id | child | parent
1 67 0
2 69 67
3 79 68
4 76 69
7 75 68
我想选择记录,直到父ID为零
同一张表中的所有记录
答案 0 :(得分:1)
引用How to represent a data tree in sql
某些数据库,尤其是MySQL,在处理此模型时遇到一些问题,因为它需要能够运行MySQL缺少的递归查询。
可以在此处找到问题(及其解决方案)的详尽解释:Managing hierarchical data in mysql
TL / DR:如果你想用一个查询来解决这个问题,那么你需要将树改为嵌套列表结构 - 这有点难以理解,但在mysql中处理起来更有效。
我们来看看这棵树:
在您的邻接列表格式中,这将是这样的
id | text | parent
1 A
2 B 1
3 C 1
4 D 3
5 E 3
6 F 1
获取节点D的所有父母并不容易。
现在我们将其转换为嵌套集:
0_________________A__________________11
1_B_2 3_______C_______8 9_F_10
4_D_5 6_E_7
id | text | lft | rgt
1 A 0 11
2 B 1 2
3 C 3 8
4 D 4 5
5 E 6 7
6 F 9 10
现在让节点D的所有父母都很容易:
SELECT p.* FROM nestedset p
INNER JOIN nestedset o ON o.lft > p.lft AND o.rgt < p.rgt
WHERE o.text == "D"
关于如何进行其他操作,请点击我发布的链接。