正如评论中所说,mysql没有捷径可走。
但!
如果您有可能更改数据库结构,则可以部署更好的设计来处理树状层次结构。
如果您遵循Bill Karwin 的THIS TUTORIAL(这里是引用该幻灯片教程的原始答案),您可以找到 4 种用于建模层次结构的方法:
- Adiacency 列表
- 路径枚举
- 嵌套集
- 封闭表
现在,最好的模型可能是第 4 个(我将其他 3 个模型的描述留给读者),它基本上需要 2 个表:一个用于元素,一个用于路径。在路径表(闭包表本身)中,您将存储从每个节点到每个后代的每条路径(不仅仅是直接子节点!)。
建议还保存每一行的路径长度,因为这样更容易查询树中的直接子节点。
即使此解决方案需要更多空间,它也具有最佳的整体性能并且非常易于使用:它根本不依赖递归查询,并且它将授予整个数据集的引用完整性!
例如,要获取节点 #4 的每个子节点:
select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4
另一个例子:获取节点#11的所有祖先
select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11
需要删除节点#6的子树
delete from paths where descendant in
(select descendant from paths where ancestor = 6)