试图理解MySQL自连接

kyks70gy  于 2022-10-22  发布在  Mysql
关注(0)|答案(3)|浏览(155)

我试图了解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`

这为我提供了一个三层深度的数据层次结构,其布局如下:

Layer 1 fields, Layer 2 fields, Layer 3 fields

1.如何使查询适用于n个深度级别?
1.如何使结果相互叠加,而不是在右侧添加字段?

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

j2qf4p5b1#

MySQL不支持递归SQL查询。大多数人以不同的方式存储分层数据,以便在单个查询中获得整个树。
请参阅我的回答:将平面表解析为树的最有效/最优雅的方法是什么?
我有一个演示文稿Models for Hierarchical Data with SQL and PHP,我在我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming中写了关于树结构数据的内容。
@Quassnoi在回答SO上的Hierarchical queries in MySQL时给出了另一个棘手的解决方案。

agyaoht7

agyaoht72#

您的查询不是递归查询;这只是一张table自我连接了三次。
5分钟的谷歌搜索会告诉你,到目前为止,MySQL不支持真正的递归查询。

k5hmc34c

k5hmc34c3#

MySQL不支持递归查询。
在其他数据库中,可以使用通用表表达式(CTE)执行递归,例如SQL ServerPostgresDB2。对于Oracle,可以使用CTE(从11g开始)或非标准CONNECT BY执行递归。MySQL不支持这两个选项。

相关问题