在mysql中停止递归乱伦的子父关系

Jam*_*itt 10 php mysql recursion parent

我用PHP/MySQL/Javascript编程.我有一个我们想要在子/父关系中链接的部分列表,对层数没有限制.

当我从一个部件列表中选择要将子项添加到父级时,我限制了部件列表以排除父本身以及已经是该父级子项的任何部分.

我发现的是,我也想排除父母的祖父母,否则我们就会得到一种乱伦的关系,当我展示部分树时会创造一个无限循环.

不仅如此,我还不能允许孩子成为父母或曾祖父母等的祖父母

这是我目前使用的SQL语句,我认为也可以通过使用来改进,LEFT JOIN但此时我对SQL不够熟练.

SELECT * 
FROM sch_part_general 
WHERE (sch_part_general.part_id <> $parentId) 
AND (sch_part_general.part_id NOT IN 
  (SELECT part_id FROM sch_part_mapping WHERE parent_id = $parentId)
)
Run Code Online (Sandbox Code Playgroud)

sch_part_general是一个包含所有部分的多列表,其中part_id为主键.sch_part_mapping是一个带有part_id(child)||的双列映射表 parent_id(父).

有人能用SQL查询指出我正确的方向吗?我并不热衷于使用while循环来创建SQL语句,因为我认为这将是非常低效的,但这是我考虑过的唯一方法.

Lie*_*ers 6

MySQL对分层查询没有太多(如果有的话)支持.如果你想坚持所谓的Adjacency List Model,你所能做的就是JOIN为你想要包含的每个级别添加一个.不用说,这不能很好地扩展.

另一方面,如果您可以更改数据库架构,我建议您实施Nested Set Model.

Mike Hillyer的博客中Nested Set Model提供了一个非常好的解释

邻接表模型的局限性

在纯SQL中使用邻接列表模型可能很难.在能够看到类别的完整路径之前,我们必须知道它所处的级别.

嵌套集模型

SQL中嵌套集的概念已经存在了十多年,书籍和互联网上还有很多其他信息可供使用.在我看来,有关管理分层信息的最全面的信息来源是一本名为Joe Celko的树和层次结构的SQL for Smarties,由一位备受尊敬的高级SQL领域的作者Joe Celko撰写.

  • 我们已经评估了嵌套模型,并认为这是继续进行的方式.非常感谢你帮助我们.看看新模型的复杂性,我认为你应该在适当的时候期待我提出更多问题;) (2认同)