我有一个存储在MYSQL数据库中的树状数据模型。通过在每个“节点”对象上使用两个字段来遍历树:
root id的parent_id为'null',树中的所有其他节点都引用了父id。
如果我想获得此树中所有节点ID的列表,我必须递归遍历树并收集每个节点的一个或多个属性,使用本质上是具有许多查询的for循环。
我想知道是否有办法在SQL中使用查询来更有效地执行此操作
答案 0 :(得分:2)
我写了一篇关于我称之为Closure Table的解决方案的高评价帖子:What is the most efficient/elegant way to parse a flat table into a tree?
我还在演示文稿Models for Hierarchical Data with SQL and PHP和我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中介绍了该设计。
我在Stack Overflow上多次回答有关分层数据查询的问题: https://stackoverflow.com/search?q=user%3A20860+%5Bhierarchical-data%5D
Quassnoi撰写了一系列关于在MySQL中查询树的博客文章: http://explainextended.com/2009/07/22/hierarchial-queries-in-mysql-identifying-trees/
Quassnoi还回答了有关分层数据的Stack Overflow的一些问题: https://stackoverflow.com/search?q=user%3A55159+%5Bhierarchical-data%5D
答案 1 :(得分:1)
您正在使用困难的模型进行搜索,即邻接列表模型。如果您知道您将拥有的父母与子女关系的潜在“级别”的数量,那么您可以构建一个查询来执行此操作。但是,如果它不是有限的数字,那么它将非常困难。
如果可能,请考虑使用嵌套集模型。这是一篇关于这个主题的好文章:
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
回到你的问题,你必须多次加入同一张桌子才能得到你想要的结果,如下所示:
SELECT *
FROM YourTable t
LEFT JOIN YourTable t2 ON t2.parentid = t1.id
LEFT JOIN YourTable t3 ON t3.parentid = t2.id
LEFT JOIN YourTable t4 ON t4.parentid = t3.id
为每个潜在的子父母关系增加一个JOIN。
希望这会有所帮助,祝你好运。