我正在从事类别管理。我在每行都有parentId的地方。类别可以是n级。
我可以递归调用php函数,该函数将返回类别树数组。

现在的问题是:在管理面板中,我想要类别列表页面,如下所示。即哪个类别属于哪个类别。

  • 主页
  • 产品(编辑)(删除)
  • 产品>产品1(编辑)(删除)
  • 产品>产品2(编辑)(删除)
  • 产品>产品2>产品2 1(编辑)(删除)
  • 产品>产品2>产品2 2(编辑)(删除)
  • 与我们联系(编辑)(删除)

  • 我希望mysql查询结果的顺序与上述相同。我不确定如何实现它。
    SELECT *
    FROM tbl_categories
    ORDER BY ???
    

    请指导。

    最佳答案

    没有一个SQL查询可以根据此表结构以预期的方式将结果排序。

    有两种方法可以解决此问题:

  • 使用外部应用程序逻辑(在DB外部)进行递归调用,这些调用将发现每个类别的子级并在应用程序中构建树。
  • 使用一种算法将树数据存储在关系数据库中。
    这种算法之一称为 Modified Preorder Tree Traversal 或简称为MPTT。

  • 假设我们使用lftrgt列来维护遍历中的左/右索引,那么当您插入新类别时,您将需要:
  • 通过ID获取父类别信息:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5让我们假设一个例子,父类别有lft=7rgt=10(在这种情况下,它已经有一个 child )
  • 为新条目腾出空间-将所有记录移位2(对于lft为1,对于rgt为1):
    UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESCUPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC

  • 注意这里ORDER降序。由于lftrgt应该是唯一的,因此建议对它们进行UNIQUE约束,然后需要在降序中进行更新以防止重复的键错误。
  • 设置lft=<former parent rgt>rgt=<former parent rgt +1>并插入新记录...
    INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...

  • 如果搜索MPTT PHP MySQL,则可以找到带有代码的更详细的示例。关于这个主题有很多教程。

    09-11 18:17