嵌套集中兄弟姐妹面前的mySql强制项

时间:2012-10-24 13:03:37

标签: php mysql nested-sets

我使用嵌套集模型存储在mySql数据库中的分层数据(类别)。

所有工作都很完美我现在需要能够向任何节点添加属性(force_to_top),这将设置节点暂时强制到其兄弟姐妹的顶部,我不是100%肯定如何在不实际更改lftrgt值的情况下执行此操作。

如果启用了节点force_to_top属性,我不希望将原始lftrgt值存储在其他位置,请更改lft和{{1}将值移动到正确位置的值,然后在删除rgt属性后重置其原始lftrgt值。我认为这将导致更大的问题,而且它似乎是一种非常迂回的做事方式? (纠正我,如果这实际上是最简单的方法!但我想找到另一个,最好只使用sql不更新数据库中的任何值)

我想知道是否有可能以某种方式操纵sql的输出,具体取决于force_to_top属性?

例如,如果我们有以下结构

force_to_top

具有以下lft / rgt / force_to_top值:

        Cars
        |
-----------------
|       |       |
Audi    Ford    VW

当我们输出'Cars'的子节点时,我们会给出:

node    lft    rgt  force_to_top
Cars    1      8    false
Audi    2      3    false
Ford    4      5    false
VW      6      7    false

但是让我们说节点'VW'的Audi Ford VW 属性设置为force_to_top,我真正需要的是'Cars'子节点的输出到现在为止:

true

正如我所提到的,我已考虑存储原始的VW Audi Ford lft值,并在删除rgt属性后重置它们。不这样做的好处是关闭force_to_top属性的速度,这意味着除了实际再次将force_to_top值设置为force_to_top和节点之外,没有数据操作会立即回到原来的位置。并且还意味着我不需要为每个节点的原始falselft值创建存储区/额外表/额外字段。

我已经考虑过在获取结果后在php中执行此操作,但对于大型数据集来说,这可能会让事情变慢。

我最初必须将rgt个节点设置为所有内容的顶部,这非常简单,只需force_to_top,但现在只强迫其兄弟姐妹的顶部要复杂得多,如同节点可能位于大规模层次结构的中心。

非常感谢任何建议或正确方向上的观点。

1 个答案:

答案 0 :(得分:0)

以防万一有人在这里遇到类似的问题(非常不可能!):

最后,我找到实现此功能的唯一方法是在其parent_id值设置为true时存储该类别的当前nearest_sibling_idforce_to_top

这样我可以通过更新lftrgt值将类别移到其父级的顶部,然后在删除force_to_top时,我可以检查{{ 1}}仍然存在,并且仍然在原始nearest_sibling_id内。如果是,请将类别移回parent_id旁边;如果没有,只需将类别移至原始nearest_sibling_id的底部,因为我们无法确定最初定位的位置,因为我们的parent_id值已过期。