MySQL自连接
作者:互联网
我有一个表(无法更改),如下所示:
POST_ID | PARENT_ID | POST_NAME
1 | 0 | Services
4 | 1 | Development
5 | 4 | Magento
2 | 0 | Contact
字段“ parent_id”引用post_id以形成自引用外键.是否可以编写单个查询以基于post_id连接帖子及其父级?
例如,如果我有post_id 5(Magento),可以编写查询以产生以下结果:
5 | Magento
4 | Development
1 | Services
我知道使用多个查询非常容易,但是,希望知道使用单个查询是否可行.
谢谢 :)
解决方法:
您正在使用adjacency list model来组织层次结构数据.这种递归操作很困难,这实际上是此模型的主要缺点.
一些DBMS(例如SQL Server 2005,Postgres 8.4和Oracle 11g)支持将common table expressions与WITH关键字一起使用来进行递归查询(另请参见下面的@Quassnoi’s注释).该功能使编写这样的查询变得容易,但是正如上面注释中提到的@OMG Ponies一样,MySQL尚不支持递归查询.
您提到不能对表进行任何更改,但是可以添加其他表吗?如果是,则您可能有兴趣查看下面的文章,该文章描述了替代模型(nested set model),该模型使递归操作更容易(可能):
> Mike Hillyer: Managing Hierarchical Data in MySQL
另外,我还建议您查看Stack Overflow的定期撰稿人@Bill Karwin的以下演示文稿:
> Bill Karwin: Models for hierarchical data with SQL and PHP
演示文稿中描述的闭包表模型是嵌套集的非常有效的替代方案.他在他的SQL Antipatterns书(excerpt from the chapter on this topic [PDF])中进一步描述了该模型.
否则,您可能希望在应用程序中执行递归部分,下载所有数据,构建一棵树,然后遍历它.
标签:hierarchical-data,sql,mysql,database 来源: https://codeday.me/bug/20191105/1998023.html