数据库
首页 > 数据库> > MySQL自连接

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