
你这个是Oracle吧
父子节点是DEPTID和FDEPTID吧
Oracle里面有一条语句是专门用来处理树的,
selectstart with connect by prior
大概是 select from table start with DEPTID=1 connect by prior DEPTID=FDEPTID
我很久没用过Oracle了,可能上面这条sql是错的具体你参考一下网上的消息吧
要是oracle多好,一句话搞定。
既然是java,给你伪代码,你补充吧:
String getDeptName(int level,String dept){
if(level==0){
return dept;
}else if(level>=10){
return "层数太大";
}else{
return getDeptName(level-1,dept->childDeptName);
}
}
相信你知道level在递归查询中的意思,除了level之外,还有一个伪列:CONNECT_BY_ISLEAF。你可以在输出的列中间加上CONNECT_BY_ISLEAF这个列,将会发现CONNECT_BY_ISLEAF为1的全是叶子节点,也就是你说的最底层。
这种类型的数据,一般数据库中,一张表会有存在两个字段,一个是它本身id,另一个是它的父级parent_id。
既然要找到它的祖父级,sql语句这样写:
$id = empty($_POST['id'])'':$_POST['id'];
$parent_id = get_parent_id($id);
$p_p_id = get_parent_id($parent_id);
function get_parent_id($id){
$sql = "select parent_id from ecs_table1 where id=" $id;
return($GLOBALS['db']->getone($sql ));
}
递归,就是根据现有的id,重复取。
上面get_parent_id只是获取父id,当然,你可以写一个直接获取祖父id的函数。
不过,现在大部分php网站,都只会有获取父类的函数,想discuz,ecshop等。获取祖父id,就是不断的获取该id的父id。
同样的语法结构可以层层嵌套,同一条结构规则可以重复使用而不致造成结构上的混乱,借数学的术语来说,这就是语法结构规则的"递归性"。
在句法组合中,递归性有两种表现,一种是从初始结构开始,自始至终重复运用同一条语法规则。例如"计算机/我//喜欢"这个句子是主谓结构,它们的谓语( / 以后的部分)本身又是主谓结构,这里,"主语+谓语"这条语法规则不间断地使用了两次;另外一种表现是,同一条语法规则可以在一个结构上间隔地重复使用。
例如在"我/看///过//他/////写////的///散文"中,第一层使用了"主语+谓语"规则,造成了"我/看过他写的散文"这个主谓结构,第五层又使用了一次"主语+谓语"规则,造成了"他写"这个主谓结构。
语法规则的递归性和语法结构的层次性密切相关。语法结构的层次性在相当大的程度上是由递归性造成的,反过来讲,语法结构的层次性也为语法规则的反复使用提供了可能。
结构中某个单位(例如词)可以不断地被一个同功能的词组去替换,结果可以使基本结构里面的项扩展成层次非常复杂的结构,但作用仍等于原先的那个项。
比如"他喝了茶"是主谓结构,我们可以通过偏正结构的递归把其中的宾语"茶"扩展成"新茶"、"江南的新茶"、"刚沏的江南的新茶"、"太太刚沏的江南的新茶"、" 太太为他刚沏的江南的新茶"等等。
结构规则的递归从理论上讲可以是无穷尽的,上面的例子不管扩展到什么地步,它的作用还是等于"他喝了茶"里面的"茶"。
任何语言的语法规则都有递归性,因而语言才富有组合上的变化性、开放性和创造性,能随表达的需要而屈伸自如。语言如果没有这一特点,就无法让人类用有限的手段来表达无限的思想。
这个问题太宽泛,具体的还的看你的组织机构表的设计
目前常见的解决办法有如下方式
1、在表设计时候加入冗余字段,维护层级关系 ,如1234,通过模糊查询即可查询出全部的下级 like '1%'
2、通过递归的方式,2005 开始支持cte,
范例如下:
with FullPathBuilder as
(
select Name
,Id from orgTable b
where bParentId is null
union all
select bName ,bId
from orgTable b join FullPathBuilder on bparentId = FullPathBuilderId
)
select from FullPathBuilder
1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存
/更新缓存文件/
$map['topid'] = 0;
$map['yiyuanid'] = $this->_get('yiyuanid');
$other['order'] = 'sort desc,keshiid asc';
$other['field'] = 'keshi,yiyuanname as yiyuan';
$other['join'] = 'yiyuan on yiyuanid=keshiyiyuanid';
$digui = digui('keshi',$map,$other);
S('keshi',$digui);//缓存数据
2、核心的三个递归函数
/
递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存
@param string $table 查询的表名
@param array $where 查询的where条件
@param array $other 其它查询需要的变量
@return array $list 一个表示层级关系的多维数组
/
function digui($table,$where,$other){
$Form = M($table);
if($other['join']){
$list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();
}else{
$list = $Form->field($other['field'])->where($where)->order($other['order'])->select();
}
foreach ($list as $k => $v) {
if($digui = digui($table,array('topid'=>$v['id']),$other)){
$list[$k]['childs'] = $digui;//递归子类
}
}
return $list;
}
/
读取递归数据的函数,使用前请把digui()函数的返回值进行缓存
@param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的
@return void 无返回值直接输出
/
function KeshiType($list){
foreach ($list as $k => $v) {
echo '<tr align="center" bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'$v['id']'</td><td width="14%">'$v['yiyuan']'</td><td width="14%">'$v['name']'</td><td><span class="coolbg" onClick="winopen(\'/Code/keshi_edit/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'\',\'id'$v['id']'\',1000,650)">编辑</span> <span alt="'$v['id']'" title="'$v['name']'" class="ksjb">编辑</span> <a href="/Yisheng/index/yiyuanid/'$v['yiyuanid']'/keshiid/'$v['id']'" class="coolbg">编辑</a> <a href="/Code/keshi_del/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'" class="coolbg">删除</a></td></tr>';
KeshiTypeSeed($v['childs']);
}
}
/
楼上KeshiType的子函数配合递归
/
function KeshiTypeSeed($list){
if($list){
echo '<tr align="center" bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';
foreach ($list as $k => $v) {
echo '<tr align="center" bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'$v['id']'</td><td width="14%">'$v['yiyuan']'</td><td width="14%">'$v['name']'</td><td><span class="coolbg" onClick="winopen(\'/Code/keshi_edit/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'\',\'id'$v['id']'\',1000,650)">编辑</span> <span alt="'$v['id']'" title="'$v['name']'" class="ksjb">管理2</span> <a href="/Yisheng/index/yiyuanid/'$v['yiyuanid']'/keshiid/'$v['id']'" class="coolbg">管理</a> <a href="/Code/keshi_del/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'" class="coolbg">删除</a></td></tr>';
KeshiTypeSeed($v['childs']);
}
echo '</table></td></tr>';
}
}
3、在模板中使用缓存进行递归栏目
/我增加了点击展开关闭栏目的jquery代码,
<script>
/
点击展开子类
/
$("jia")click(function(){
if($(this)parent("td")parent("tr")next("seed")is(":hidden")){
$(this)parent("td")parent("tr")next("seed")show();
$(this)html("-");
}else{
$(this)parent("td")parent("tr")next("seed")hide();
$(this)html("+");
}
});
$("seed")prev("fid")find("td")find("spanjia")html("-");
/
点击关闭所有子类
/
$("#closeseed")click(function(){
if($(this)val() == "展开所有子类"){
$("seed")show();
$(this)val("关闭所有子类");
$each($("jia"),function(k,v){
if($(this)html()){
$(this)html("-");
}
});
}else{
$("seed")hide();
$(this)val("展开所有子类");
$each($("jia"),function(k,v){
if($(this)html()){
$(this)html("+");
}
});
}
});
});
</script>
//模板递归的部分
<php>
$keshis = S('keshi');//读取缓存
KeshiType($keshis);//递归输出数据
</php>
以上就是关于如何利用java递归遍历得到树全部的内容,包括:如何利用java递归遍历得到树、用java实现根据公司编码取得任意层级的部门列表、oracle 用递归层次查询 怎么只查询最底层的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)