修改的预订树遍历:选择1级深的节点

net*_*iul 3 sql modified-preorder-tree-t hierarchical-data

我使用修改的预订树遍历算法保存了分层有序数据.

这是表格内容:

id  lft  rgt  name
1   1    10   topnode
2   2    3    level1
3   4    7    level1
4   5    6    level2
5   8    9    level1
Run Code Online (Sandbox Code Playgroud)

可视化:

方案

我想要的只是选择某个节点的子节点(所以不是子节点的子节点).让我们说'topnode'.我正在尝试修复查询,但我似乎无法理解它.

搜索互联网给我带来了一段时间,例如:我可以计算每个节点的深度,但我似乎无法选择它.

这个查询

SELECT node.*, (COUNT(parent.id) - 1) AS depth
FROM tree AS node
CROSS JOIN tree AS parent
WHERE (node.lft BETWEEN parent.lft AND parent.rgt)
GROUP BY node.id
ORDER BY node.lft
Run Code Online (Sandbox Code Playgroud)

显示每个节点的深度:

id  lft  rgt  name     depth
1   1    10   topnode  0
2   2    3    level1   1
3   4    7    level1   1
4   5    6    level2   2
5   8    9    level1   1
Run Code Online (Sandbox Code Playgroud)

这很好,但我不能使用柱深作为条件!

Edw*_*ard 10

我认为这应该可以解决问题

SELECT node.*, (COUNT(parent.id) - 1) AS depth
FROM tree AS node
CROSS JOIN tree AS parent
WHERE (node.lft BETWEEN parent.lft AND parent.rgt)
GROUP BY node.id
HAVING depth = {{ENTER YOUR REQUIRED DEPTH HERE}}
ORDER BY node.lft
Run Code Online (Sandbox Code Playgroud)

希望有所帮助

  • +1,因为它的工作原理,但我的35000节点树(8秒)真的很慢.不能用它:( (3认同)