处理树形递归的问题Mysql中,实现类似oracle的sys_connect_by_path功能。请大家帮忙,谢谢!测试数据如下:
create table AUDIT_FORM
(
FORM_ID VARCHAR2(32) not null,
FORM_NAME VARCHAR2(256),
PARENT_FORM_ID VARCHAR2(32),
TYPE_ID VARCHAR2(32),
AD_TYPE VARCHAR2(32)
)insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('001', '供应商表现', '000', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('002', '交货准确度', '001', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('003', '交货质量', '001', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('004', '价钱竞争力', '001', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('005', '数量准确度', '002', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('006', '时间准确度', '002', 'form', 'count');
1、使用oracle sys_connect_by_path 可得出递归树的完整路径。
select sys_connect_by_path(form_id,'/') path,form_id,form_name,parent_form_id from audit_form
start with parent_form_id = '000'
connect by parent_form_id = prior form_id;
PATH FORM_ID FORM_NAME/001 1 供应商表现
/001/002 2 交货准确度
/001/002/005 5 数量准确度
/001/002/006 6 时间准确度
/001/003 3 交货质量
/001/004 4 价钱竞争力2、希望达到的效果如下:PATH FORM_ID FORM_NAME1 1 供应商表现
1.1 2 交货准确度
1.1.1 5 数量准确度
1.1.2 6 时间准确度
1.2 3 交货质量
1.3 4 价钱竞争力即:
1) 一个树的同一父节点下的同级子节点,进行组内排序。
2) 上一步的排序结果 + 该节点的父节点的排序结果 。以此类推 ....
3) 得出完整的排序结果(类似路径)
4)MySql 如何实现这种树形递归的效果
create table AUDIT_FORM
(
FORM_ID VARCHAR2(32) not null,
FORM_NAME VARCHAR2(256),
PARENT_FORM_ID VARCHAR2(32),
TYPE_ID VARCHAR2(32),
AD_TYPE VARCHAR2(32)
)insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('001', '供应商表现', '000', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('002', '交货准确度', '001', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('003', '交货质量', '001', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('004', '价钱竞争力', '001', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('005', '数量准确度', '002', 'form', 'score');
insert into AUDIT_FORM (FORM_ID, FORM_NAME, PARENT_FORM_ID, TYPE_ID, AD_TYPE)
values ('006', '时间准确度', '002', 'form', 'count');
1、使用oracle sys_connect_by_path 可得出递归树的完整路径。
select sys_connect_by_path(form_id,'/') path,form_id,form_name,parent_form_id from audit_form
start with parent_form_id = '000'
connect by parent_form_id = prior form_id;
PATH FORM_ID FORM_NAME/001 1 供应商表现
/001/002 2 交货准确度
/001/002/005 5 数量准确度
/001/002/006 6 时间准确度
/001/003 3 交货质量
/001/004 4 价钱竞争力2、希望达到的效果如下:PATH FORM_ID FORM_NAME1 1 供应商表现
1.1 2 交货准确度
1.1.1 5 数量准确度
1.1.2 6 时间准确度
1.2 3 交货质量
1.3 4 价钱竞争力即:
1) 一个树的同一父节点下的同级子节点,进行组内排序。
2) 上一步的排序结果 + 该节点的父节点的排序结果 。以此类推 ....
3) 得出完整的排序结果(类似路径)
4)MySql 如何实现这种树形递归的效果
http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/02/4142971.aspx
MYSQL 就麻烦多了,只能自己写游标实现。