关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现, mysql没有这样的便捷途径,所以mysql遍历数据表是我们经常会遇到的头痛问题,下面通过数据库函数来实现
1、建表
① 机构表
create table `t_sys_org` (
`id` varchar(64) not null comment '主键id',
`code` varchar(60) default null comment '编码',
`name` varchar(200) default null comment '机构名称',
`fullname` varchar(100) default null,
`shortname` varchar(60) default null comment '机构简称',
`orgcode` varchar(60) default null comment '机构代码',
`parentid` varchar(64) default null comment '上级机构',
`depth` int(10) default null comment '深度',
`sort` varchar(24) default null comment '排序',
`remark` varchar(200) default null comment '备注',
`status` varchar(4) default null comment '状态',
`orgtype` varchar(2) default null comment '机构类型',
`codenum` varchar(80) default null comment '单位代码证编号',
`leagalperson` varchar(18) default null comment '机构法人',
`leagalpersonid` int(10) default null comment '负责人id',
`splitleader` varchar(80) default null comment '分管领导',
`splitleaderid` int(10) default null comment '分管领导id',
`adminlevel` varchar(16) default null comment '机构行政级别',
`nature` varchar(16) default null comment '机构性质',
`worknatureb` varchar(100) default null comment '机构工作性质(大类)',
`worknaturem` varchar(16) default null comment '机构工作性质(中类)',
`worknatures` varchar(100) default null comment '机构工作性质(小类)',
`arecode` varchar(16) default null comment '单位所隶属行政区划',
`address` varchar(800) default null comment '单位驻地与地址',
`mailcode` varchar(16) default null comment '单位邮编',
) engine=innodb default charset=utf8 comment='机构表(t_sys_org)';
②用户表
create table `t_sys_user` (
`id` varchar(64) not null comment '主键id',
`account` varchar(200) default null comment '账号',
`username` varchar(60) default null comment '姓名',
`password` varchar(120) default null comment '密码',
`idcard` varchar(72) default null comment '身份证号',
`sex` varchar(4) default null comment '性别',
`createtime` datetime default null comment '创建时间',
`modtime` datetime default null comment '修改时间',
`modpwdtime` datetime default null comment '修改密码时间',
`remark` varchar(500) default null comment '备注',
`status` int(10) default null comment '状态',
`adminlevle` varchar(16) default null comment '行政级别',
`alarmbell` varchar(16) default null comment '*',
`archivedeptid` decimal(10,0) default null comment '档案部门id',
`authorized` varchar(16) default null comment '编制',
`birthday` datetime default null comment '出生日期',
`birthplace` varchar(128) default null comment '籍贯',
`createby` decimal(10,0) default null comment '创建人',
`educationalbg` varchar(16) default null comment '最高学历',
`modifyby` decimal(10,0) default null comment '修改人',
`nation` varchar(16) default null comment '民族',
`policenumber` varchar(64) default null comment '警号',
`political` varchar(16) default null comment '政治面貌',
`position` varchar(16) default null comment '职务',
`positionlevle` varchar(16) default null comment '职级',
`sortno` varchar(200) default null comment '排序级别',
`workdeptid` varchar(64) default null comment '工作部门id',
`orgid` varchar(64) default null comment '所属机构',
`userstatus` decimal(10,0) default null comment '用户状态',
`cocallstatus` decimal(10,0) default null comment '即时通同步状态',
`compositiondeptid` decimal(10,0) default null comment '编制部门',
`recordsmagorg` varchar(100) default null comment '档案管理单位',
`nickname` varchar(64) default null comment '昵称',
`worknumber` varchar(100) default null comment '工作证号',
`userkey` text comment '用户键值',
`partjobno` varchar(4) default null,
`img_path` varchar(200) default null comment '照片路径',
primary key (`id`),
unique key `account_unique` (`account`) using btree,
key `ind_susr_orgid` (`orgid`) using btree,
key `ind_susr_stat` (`status`) using btree,
key `ind_susr_stno` (`sortno`) using btree,
key `ind_susr_ustat` (`userstatus`) using btree,
key `ind_susr_wdpid` (`workdeptid`) using btree
) engine=innodb default charset=utf8 comment='用户表';
3、使用function根据指定的id流水号获取多级部门编号(包括当前id)
begin
declare stemp varchar(4000);
declare stempchd varchar(4000);
set stemp = '$';
set stempchd = cast(orgid as char);
while stempchd is not null do
set stemp = concat(stemp,',',stempchd);
select group_concat(id) into stempchd from t_sys_org where find_in_set(parentid,stempchd)>0;
end while;
return stemp;
end
4、根据部门id获取该部门下的所有子部门
select id from t_sys_org where find_in_set ( id, queryallchildbyorg('448457')) order by code;
5、根据获取的子部门获取其所有的用户信息
select username, workdeptid from t_sys_user where workdeptid in select id from t_sys_org where find_in_set ( id, queryallchildbyorg('448457')) order by code)