试图了解MySQL自联接

时间:2011-11-17 17:35:19

标签: mysql sql hierarchical-data

我正在尝试理解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 
  1. 如何让查询适用于 n 深度级别?
  2. 如何将结果堆叠在一起而不是向右边添加字段?

    Layer 1 Row
    Layer 2 Row
    Layer 2 Row
    Layer 3 Row
    Layer 3 Row
    Layer 2 Row
    Layer 3 Row
    Layer 2 Row
    

3 个答案:

答案 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 ServerPostgresDB2。使用Oracle,您可以使用CTE(截至11g)或非标准CONNECT BY。 MySQL不支持这两种选项。