我正在从事类别管理。我在每行都有parentId的地方。类别可以是n级。
我可以递归调用php函数,该函数将返回类别树数组。
现在的问题是:在管理面板中,我想要类别列表页面,如下所示。即哪个类别属于哪个类别。
我希望mysql查询结果的顺序与上述相同。我不确定如何实现它。
SELECT *
FROM tbl_categories
ORDER BY ???
请指导。
最佳答案
没有一个SQL查询可以根据此表结构以预期的方式将结果排序。
有两种方法可以解决此问题:
这种算法之一称为
Modified Preorder Tree Traversal
或简称为MPTT。 假设我们使用
lft
和rgt
列来维护遍历中的左/右索引,那么当您插入新类别时,您将需要:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5
让我们假设一个例子,父类别有lft=7
和rgt=10
(在这种情况下,它已经有一个 child )UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESC
UPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC
注意这里
ORDER
降序。由于lft
和rgt
应该是唯一的,因此建议对它们进行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
,则可以找到带有代码的更详细的示例。关于这个主题有很多教程。