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语句,因为我认为这将是非常低效的,但这是我考虑过的唯一方法.
MySQL对分层查询没有太多(如果有的话)支持.如果你想坚持所谓的Adjacency List Model,你所能做的就是JOIN为你想要包含的每个级别添加一个.不用说,这不能很好地扩展.
另一方面,如果您可以更改数据库架构,我建议您实施Nested Set Model.
Mike Hillyer的博客中Nested Set Model提供了一个非常好的解释
邻接表模型的局限性
在纯SQL中使用邻接列表模型可能很难.在能够看到类别的完整路径之前,我们必须知道它所处的级别.
嵌套集模型
SQL中嵌套集的概念已经存在了十多年,书籍和互联网上还有很多其他信息可供使用.在我看来,有关管理分层信息的最全面的信息来源是一本名为Joe Celko的树和层次结构的SQL for Smarties,由一位备受尊敬的高级SQL领域的作者Joe Celko撰写.
| 归档时间: |
|
| 查看次数: |
1859 次 |
| 最近记录: |