mysql 子节点的某一个_MySQL高效查询某节点下的所有子节点

MySQL不是T-SQL,没有cte,那么要查询子节点就会比较麻烦,需要在程序中使用到递归查询。

比较好的做法是,在建表的时候,就要考虑到此问题,需要有一个存节点层级信息的字段,比如这样:

f24f160aff9ad9051d967bde1b9fde78.png

设置方法为:

public int insert(Organization organization) {

NumberFormat num = getNumberInstance();

num.setGroupingUsed(false);

num.setMinimumIntegerDigits(3);

//设置code

if(organization.getParentId()!=null){ //子节点

//获取父节点的code

String parentCode = organizationMapper.findCodeById(organization.getParentId());

//根据父节点的code,获取当前地区编号的最大值

String maxCodeByDivisionCode = organizationMapper.findMaxCodeByDivisionCode(parentCode);

if(maxCodeByDivisionCode.equals(parentCode)){

organization.setCode(maxCodeByDivisionCode + "001");

}else{

//地区编号最大值+1

int code = Integer.parseInt(maxCodeByDivisionCode.substring(maxCodeByDivisionCode.length() - 3, maxCodeByDivisionCode.length()))+1;

organization.setCode(maxCodeByDivisionCode.substring(0,maxCodeByDivisionCode.length()-3)+num.format(code));

}

}else{ //顶级节点

//根据当前节点code,获取当前地区编号的最大值

String maxCodeByDivisionCode = organizationMapper.findMaxCodeByDivisionCode(organization.getDivisionCode());

if(maxCodeByDivisionCode!=null){

int code = Integer.parseInt(maxCodeByDivisionCode.substring(maxCodeByDivisionCode.length() - 3, maxCodeByDivisionCode.length()))+1;

organization.setCode(maxCodeByDivisionCode.substring(0,maxCodeByDivisionCode.length()-3)+num.format(code));

}else{

organization.setCode(maxCodeByDivisionCode + "001");

}

}

return this.organizationMapper.insert(organization);

}

这么设计的好处是:

你可以根据任何一个节点来找他下面所有的子节点及子节点下的子节点,like一下就出来了;

可以根据任何一个子节点来找他上级节点,上级的上级,直到顶级节点,只需根据这个字段拆分下就行而不需要做数据库查询。

另外,我这里的 divisionCode 是地区编号,且是新增时的必选字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值