【问题标题】:mySql force item in front of siblings in nested set嵌套集中兄弟姐妹前面的mySql强制项
【发布时间】:2012-10-24 13:03:36
【问题描述】:

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

一切正常,只是我现在需要向任何节点 (force_to_top) 添加属性的能力,这会将节点设置为暂时强制到其兄弟节点的顶部,但我不是 100% 确定如何无需物理更改 lftrgt 值即可执行此操作。

当节点force_to_top 属性打开时,我不想将原始lftrgt 值存储在别处,更改lftrgt 值以将节点移动到正确位置,然后在删除 force_to_top 属性后重置它们的原始 lftrgt 值。我认为这会进一步导致严重的问题,而且这似乎是一种非常迂回的做事方式? (如果这实际上是最简单的方法,请纠正我!但我想找到另一个,最好只使用 sql 不更新数据库中的任何值)

我想知道是否可以根据force_to_top 属性以某种方式操纵 sql 的输出?

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

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

这将具有以下 lft/rgt/force_to_top 值:

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

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

Audi
Ford
VW

但是假设节点'VW'的force_to_top属性设置为true,我真正需要的是'Cars'的子节点的输出现在是:

VW
Audi
Ford

正如我所提到的,我考虑过存储原始 lftrgt 值并在删除 force_to_top 属性后重置它们。不这样做的好处是关闭force_to_top 属性的速度,这意味着除了将force_to_top 值再次设置为false 之外没有任何数据操作,并且节点将立即回退到它的原来的位置。这也意味着我不需要为每个节点的原始 lftrgt 值创建存储区域/额外表/额外字段。

我也考虑过在获取结果后在 php 中执行此操作,但对于大型数据集可能真的会减慢速度。

我最初必须将 force_to_top 节点设置到所有节点的顶部,这很容易,只需 ORDER BY force_to_top, lft,但是现在只强制到其兄弟节点的顶部要复杂得多,因为节点可能是在一个庞大的层次结构的中心。

任何建议或正确方向的观点将不胜感激。

【问题讨论】:

    标签: php mysql nested-sets


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 2015-01-28
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多