这个问题让我很头疼。
我的数据库中有两个表,借助称为“闭包表”的设计来解决类别排序问题。第一个表被调用categories
,另一个被命名categoriesPaths
。
类别只是一个基于语言的表:
id | name
----------------
0 | Category 1
1 | Category 2
类别路径看起来像这样:
parent | children | level
-----------------------
1 | 1 | 0
1 | 2 | 1
2 | 2 | 0
要删除路径及其最终的子节点,我运行以下查询:($top 是删除将开始的顶级父节点级别)
DELETE d FROM CategoriesPaths children
JOIN CategoriesPaths a USING (children)
WHERE a.parent = $top;
我想要做的是更改查询以删除categories
表中的代表性路径。不幸的是,我没有足够的 SQL 知识来做到这一点。我试图在查询之前使用 foreach 循环来解决问题,但这无法删除,因为该categories
表被引用了categoriesPaths
......话虽如此,我几乎被卡住了。
如果有人想了解更多关于闭包表设计的信息,这里是我从中学习到的幻灯片的参考:http ://www.slideshare.net/billkarwin/sql-antipatterns-strike-back