我正在尝试理解MySQL递归查询的工作原理,并以我想要的方式获取数据。
现在我有以下SQL
SELECT `Library`.*, l2.*, l3.*
FROM `Library`
LEFT JOIN `Library` as `l2` on `l2`.`subsectionOf`=`Library`.`iD`
LEFT JOIN `Library` as `l3` on `l3`.`subsectionOf`=`l2`.`iD`
WHERE `Library`.`iD` = 0x02
ORDER BY `Library`.`subsectionOrder`, `l2`.`subsectionOrder`, `l3`.`subsectionOrder`
这让我得到了一个3层深度的数据层次结构:
Layer 1 fields, Layer 2 fields, Layer 3 fields
如何将结果堆叠在一起而不是向右边添加字段?
Layer 1 Row
Layer 2 Row
Layer 2 Row
Layer 3 Row
Layer 3 Row
Layer 2 Row
Layer 3 Row
Layer 2 Row
答案 0 :(得分:3)
MySQL不支持递归SQL查询。大多数人以不同方式存储分层数据,因此他们可以在单个查询中获得整个树。
请参阅我对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中写了关于树状结构数据的文章。
另一个棘手的解决方案是@Quassnoi在这里对Hierarchical queries in MySQL的回答。
答案 1 :(得分:1)
您的查询不是递归查询;它只是一张桌子自我加入3次。
5分钟的谷歌搜索将向您显示,截至目前,MySQL不支持真正的递归查询。
答案 2 :(得分:1)
MySQL不支持递归查询。
在其他数据库中,您可以使用公用表表达式(CTE)执行递归,例如使用SQL Server,Postgres和DB2。使用Oracle,您可以使用CTE(截至11g)或非标准CONNECT BY
。 MySQL不支持这两种选项。