一、查找某个部门下所有子部门以及最下级部门,一个部门会有多个子级
设计部门表department,有parent_id可以绑定直接上级部门,level可以给部门分层级,对于后期查找上级或者下级部门很有用,可以以此为顺序查找
字段:id, parent_id(所属上级部门id), name(部门名称),level(部门层级,比如最上级的部门为1,他下面的部门为2,以此类推)
实现思路:
1.查找部门id为1的所有子部门,查找部门的level
select level from department where parent_id=1
2.设取出来的部门level为1,查找所有部门level > 1,按照level正序排序,保证遍历时的数据是从高层部门到低层部门的
select * from department where level> 1 order by leavel
执行完后,查出来的是所有符合要求的部门list_dep
3.遍历list_dep,最先遍历的数据肯定是后面数据的上层部门
list_children_dep = [] # 存储所有子部门,且按照level排序的
list_dep_id = [1] # 存储目的部门下的所有子部门id,按照上下层顺序存储
for dep in list_dep:
#查找部门的父类id是否存在于list_dep_id中:存在,代表是符合要求的子部门,不存在,代表不是当前部门的子部门或者间接子部门
if dep.parent_id.id in list_dep_id:
list_children_dep.append(dep)
4.list_children_dep就是最后当前部门的所有子部门,第一个数据就是直接子部门之一,最后一个数据就是最后子部门之一
二、查找某个部门下所有父部门以及最上级部门(根部门),一个部门只有一个上级部门
类似第一种情况,不过从第2步开始有改动
2.设取出来的部门level为10,查找所有部门level < 10,按照level倒序排序,保证遍历时的数据是从低层部门到高层部门的,这样就可以保证最后查出的部门就是根部门
select * from department where level < 10 order by leavel desc
执行完后,查出来的是所有符合要求的部门list_dep
3.遍历list_dep,最先遍历的数据肯定是后面数据的下层部门
list_parent_dep = [] # 存储所有父部门,且按照level倒序排序的
dep_A # 代表当前部门
for dep in list_dep:
#查找当前部门的上级部门是否为dep,如果是,则存储到列表中,且将当前部门指定的对象变为当前的dep;不是则不处理
if dep_A.parent_id.id == dep.id:
list_parent_dep.append(dep)
dep_A = dep
4.list_parent_dep中存储的就是当前部门的所有上级部门,按照层级,从低到高,第一个数据就是当前部门的直接上级部门,最后一个就是当前部门的最上级部门,即根级部门