• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

【原创】MySQL 模拟Oracle邻接模型树形处理

mysql 搞代码 4年前 (2022-01-09) 13次浏览 已收录 0个评论

数据库对层次结构的处理模型有好多种,可以根据自己的需求来设计模型,当然最简单的也是最容易设计的模型就是所谓的邻接模型。在这方面,其他数据库比如Oracle提

数据库对层次结构的处理模型有好多种,可以根据自己的需求来设计模型,,当然最简单的也是最容易设计的模型就是所谓的邻接模型。在这方面,其他数据库比如Oracle 提供了现成的分析方法 connect by,而MySQL在这方面就显得有些薄弱了。 不过可以用MySQL的存储过程实现ORACLE类似的分析功能

这样,先来创建一个简单的数表。

create table country ( id number(2) not null, name varchar(60) not null);create table country_relation (id number(2), parentid number(2));

插入一些数据

— Table country.insert into country (id,name) values (0,’Earth’);insert into country (id,name) values (2,’North America’);insert into country (id,name) values (3,’South America’);insert into country (id,name) values (4,’Europe’);insert into country (id,name) values (5,’Asia’);insert into country (id,name) values (6,’Africa’);insert into country (id,name) values (7,’Australia’);insert into country (id,name) values (8,’Canada’);insert into country (id,name) values (9,’Central America’);insert into country (id,name) values (10,’Island Nations’);insert into country (id,name) values (11,’United States’);insert into country (id,name) values (12,’Alabama’);insert into country (id,name) values (13,’Alaska’);insert into country (id,name) values (14,’Arizona’);insert into country (id,name) values (15,’Arkansas’);insert into country (id,name) values (16,’California’);– Table country_relation.insert into country_relation (id,parentid) values (0,NULL);insert into country_relation (id,parentid) values (2,0);insert into country_relation (id,parentid) values (3,0);insert into country_relation (id,parentid) values (4,0);insert into country_relation (id,parentid) values (5,0);insert into country_relation (id,parentid) values (6,0);insert into country_relation (id,parentid) values (7,0);insert into country_relation (id,parentid) values来源gaodaimacom搞#^代%!码网 (8,2);insert into country_relation (id,parentid) values (9,2);insert into country_relation (id,parentid) values (10,2);insert into country_relation (id,parentid) values (11,2);insert into country_relation (id,parentid) values (12,11);insert into country_relation (id,parentid) values (13,11);insert into country_relation (id,parentid) values (14,11);insert into country_relation (id,parentid) values (15,11);insert into country_relation (id,parentid) values (16,11);

在Oracle 里面,对这些操作就比较简单了,都是系统提供的。

比如下面四种情形:

1). 查看深度,

select max(level) “level” from COUNTRY_RELATION a start with a.parentid is NULLconnect by PRIOR a.id = a.PARENTIDorder by level; level———- 4已用时间: 00: 00: 00.03

2). 查看叶子节点

select name from (select b.name, connect_by_isleaf “isleaf”from COUNTRY_RELATION a inner join country b on (a.id = b.id) start with a.parentid is NULL connect by prior a.id = a.PARENTID ) T where T.”isleaf” = 1;NAME————————————————–CanadaCentral AmericaIsland NationsAlabamaAlaskaArizonaArkansasCaliforniaSouth AmericaEuropeAsiaAfricaAustralia已选择13行。已用时间: 00: 00: 00.01

3) 查看ROOT节点

select connect_by_root b.namefrom COUNTRY_RELATION a inner join country b on (a.id = b.id) start with a.parentid is NULL connect by a.id = a.PARENTID CONNECT_BY_ROOTB.NAME————————————————–Earth已用时间: 00: 00: 00.01

4). 查看路径

select sys_connect_by_path(b.name,’/’) “path” from COUNTRY_RELATION a inner join country b on (a.id = b.id) start with a.parentid is NULL connect by prior a.id = a.PARENTID order by level,a.id;path————————————————–/Earth/Earth/North America/Earth/South America/Earth/Europe/Earth/Asia/Earth/Africa/Earth/Australia/Earth/North America/Canada/Earth/North America/Central America/Earth/North America/Island Nations/Earth/North America/United States/Earth/North America/United States/Alabama/Earth/North America/United States/Alaska/Earth/North America/United States/Arizona/Earth/North America/United States/Arkansas/Earth/North America/United States/California已选择16行。已用时间: 00: 00: 00.01

接下来我们看看在MySQL 里面如何实现上面四种情形:

前三种都比较简单,可以很容易写出SQL。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【原创】MySQL 模拟Oracle邻接模型树形处理

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址