您好,欢迎访问一九零五行业门户网

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

数据库对层次结构的处理模型有好多种,可以根据自己的需求来设计模型,当然最简单的也是最容易设计的模型就是所谓的邻接模型。在这方面,其他数据库比如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 (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.032). 查看叶子节点
select name from (select b.name, connect_by_isleaf isleaffrom 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.014). 查看路径
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。
其它类似信息

推荐信息