关于树型结构数据递归查询,转非递归查询的实现

常见树型表的基础结构(1)

ID

PID


节点编号

所属父节点编号

 

对这类树型结构的数据进行查询一般是递归,即:

输入节点编码,然后在一个递归查询中串出所有子节点列表;

树型表基础表结构的改进(2)

ID

PID

MarkNum

LevelNum

节点编号

所属父节点编号

节点基数

节点所在层级数

MarkNum为节点基数字段

注:MarkNum受小数精度极限影响,可设为字符串类型

LevelNum为节点所属层级字段

这两个值的计算方式如下:

N任意层的基数(0<N<=1)

L层极数(L>=1)

M倍数规则(M=1/2)


K同层同父的相邻节点的增量

P 扩展小数位的长度(P=4),该值与同父子节点的个数相关,以P=4为例,同父子节点的个数为最大为999

W为任意层级数L实际保留小数的位数

W=L-2+(L-1)*P    (L>=2)

K=(1/10)W

 

同父各子节点基数计算方式如下:

 

N`同父的各子节点基数

I同父的子节点序列索引数(I>=1)

 

改进后的表节点查询可以以非递归方式实现,即:

根据节点所在的基数和所属层级数,这两个参数进行指定的计算式来生成查询操作所需的条件:

R(N,L)为生成查询条件

N为输入节点的基数

L(L>=2)为输入节点所属层级数

roundsql标准函数

n 为表(2)中所有节点的基数集合

R(N,L) =>  0== mod(N,round(n,W)) ΛL

伪代码(php脚本实现)

//父节点基数的

$num=基数值;

//父节点基数有效值的小数位数

$valid=W;

while($currentLevel<=$maxLevel){

        $v[$currentLevel]=$valid;

        $currentLevel++;       

        $valid++;           

}

$where='';

foreach($v as$key => $item){

$where.="or (mod({$num},round(marknum,{$item}))=0and orglevel={$key})";            

}


本人技术能力有限,不足之处,请指教 吐舌头basic_wan@163.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值