使用递归,根据部门查询出所有下级所有各个层级子部门的信息

class Department{
  private String id;
  private String parentId;
  private String depName;
  
  public Department(){
   
  }

  public String getId() {
   return id;
  }

  public void setId(String id) {
   this.id = id;
  }

  public String getParentId() {
   return parentId;
  }

  public void setParentId(String parentId) {
   this.parentId = parentId;
  }

  public String getDepName() {
   return depName;
  }

  public void setDepName(String depName) {
   this.depName = depName;
  }
  
  public boolean equals(Object obj){
   if(this.id.equals(((Department)obj).getId()))
     return true;
   else
    return false;
  }
 }
 
 
 public void test(){
  List<Department> deps = new ArrayList<Department>();
  
  Department d3 = new Department();
  d3.setId("003");
  d3.setParentId("002");
  d3.setDepName("产品部");
  deps.add(d3);
  
  Department d1 = new Department();
  d1.setId("001");
  d1.setParentId(null);
  d1.setDepName("技术部");
  deps.add(d1);
  
  Department d2 = new Department();
  d2.setId("002");
  d2.setParentId("001");
  d2.setDepName("研发部");
  deps.add(d2);
  
  
  List<Department> ds = this.getDeps(d1,deps);
  ds.add(0, d1);
  for(Department dep : ds)
   System.out.println(dep.getDepName());
 }
 
 
 public List<Department> getDeps(Department department,List<Department> allDeps){
  List<Department> child= new ArrayList<Department>();
  List<Department> result = new ArrayList<Department>();
  for(Department dep : allDeps)
   if(dep.getParentId() != null && dep.getParentId().equals(department.getId()))
    child.add(dep);
  result.addAll(child);
  for(Department dep : child)
   result.addAll(getDeps(dep,allDeps));
  return result;
 }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用递归查询结合树形结构来实现。 首先,我们可以创建一个临时表temp_user,用于存储用户的id、name、phone、nickname、password、parent_id(邀请人的id)和level(用户所在的层级信息。初始时,我们将所有用户的parent_id设置为null,并将所有用户的level设置为1。 然后,我们可以使用循环语句来不断更新temp_user表中的parent_id和level信息,直到所有用户的下级关系和层级信息都被更新完毕。 具体实现步骤如下: 1. 创建临时表temp_user: ``` CREATE TEMPORARY TABLE temp_user ( id INT, name VARCHAR(50), phone VARCHAR(20), nickname VARCHAR(50), password VARCHAR(50), parent_id INT, level INT ); ``` 2. 将所有用户的信息插入temp_user表中,初始时将parent_id设置为null,level设置为1: ``` INSERT INTO temp_user(id, name, phone, nickname, password, parent_id, level) SELECT id, name, phone, nickname, password, null, 1 FROM app_user; ``` 3. 使用循环语句来更新temp_user表中的parent_id和level信息,直到所有用户的下级关系和层级信息都被更新完毕: ``` SET @current_level = 1; SET @max_level = 10; -- 最多支持10级层级结构,可以根据实际情况调整 WHILE @current_level <= @max_level DO UPDATE temp_user AS t1 INNER JOIN temp_user AS t2 ON t1.parent_id = t2.id SET t1.parent_id = t2.parent_id, t1.level = t2.level + 1 WHERE t2.level = @current_level; SET @current_level = @current_level + 1; END WHILE; ``` 4. 查询某个用户的所有下级信息: ``` SELECT * FROM temp_user WHERE parent_id = [用户的id]; ``` 5. 查询某个用户的所有下级信息以及层级信息: ``` SELECT id, name, phone, nickname, password, level FROM temp_user WHERE id = [用户的id] UNION ALL SELECT t2.id, t2.name, t2.phone, t2.nickname, t2.password, t2.level FROM temp_user AS t1 INNER JOIN temp_user AS t2 ON t1.id = [用户的id] AND t1.id = t2.parent_id; ``` 需要注意的是,以上查询语句没有限制每个用户的邀请人数,如果某个用户的邀请人数非常多,可能会导致查询性能下降。可以根据实际情况进行优化,例如限制每个用户的邀请人数不超过100。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值