1

我正在寻找一种非递归解决方案来进行 MySQL 查询以选择节点的所有叶节点(子节点、孙子节点等),同时只知道节点的直接子节点是谁。

目前我有以下表格:

节点:

  • 身份证 (INT)
  • 数据(VARCHAR)

关系:

  • 父 ID (INT)
  • childId (INT)
  • childNodeOrder (INT)

我目前的方式只能选择父节点的直接子节点(对于这个例子,让父 Id = 1):

SELECT * FROM  Nodes n
JOIN Relationships r ON r.childId = n.id
WHERE r.parentId = 1
ORDER BY r.childNodeOrder;

有什么方法可以让我轻松地更改这个数据库而不使用递归调用(在我的服务器端代码上)并且能够获取父级的所有后代叶子?

到目前为止,我已经看过像这样的问题,这似乎是一个根本性的变化,而且不太容易切换......

4

1 回答 1

1

请参阅 NESTED SET 数据模型,它可能在这里有所帮助。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

编辑:由于需要更多上下文,这里是详细信息。

父节点将具有覆盖范围 [left, right] 的 left 和 right 属性。

所有子节点都将包含在该范围内,因此:

parent.left <= child.left <= child.right <= parent.right。

所有叶子节点的范围都是 1,因此 left + 1 = right 仅适用于叶子。

要从父节点获取所有叶子,请使用类似于以下的 where 子句:

WHERE (left + 1 = right) AND (left >= parent.left) AND (right <= parent.right)

于 2012-11-28T16:26:08.813 回答