MySql 通过子类倒查父类
2016-06-02 17:40
633 查看
前段时间客户提出一个需求:显示有设备信息的部门,没有设备信息的隐藏。这个问题确实很简单,但是表结构是这样的。。。。根据《中华人民共和国**法》,我将需求改成可以“欣赏”的,以备其他同学使用。
第一道菜:表结构:
公司表:
员工表:
电话表:
第二道菜:需求
将拥有电话员工的部门按照树的形式展示出来。
第三道菜:sql源码
存储过程:showParentLst()
存储过程:getParentByChild(childId)
PS:以上代码是通过SQLyog写的。
第四道菜:代码运行效果
所要的需求达到了!
如果其他小伙伴有更好的方法,请告知!
参考:http://blog.csdn.net/ACMAIN_CHM/article/details/4142971
第一道菜:表结构:
公司表:
员工表:
电话表:
第二道菜:需求
将拥有电话员工的部门按照树的形式展示出来。
第三道菜:sql源码
存储过程:showParentLst()
DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `showParentLst`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `showParentLst`() BEGIN DECLARE done_tel INT DEFAULT 0; DECLARE done_emp INT DEFAULT 0; DECLARE father_tel VARCHAR(255); DECLARE father_emp VARCHAR(255); DECLARE cur_tel CURSOR FOR SELECT DISTINCT Employee_id FROM telephone; DECLARE cur_emp CURSOR FOR SELECT DISTINCT dept_id FROM employee WHERE Employee_id IN (SELECT Employee_id FROM telephone); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_tel = 1; CREATE TEMPORARY TABLE IF NOT EXISTS tmpLst (dept_id VARCHAR(10) PRIMARY KEY, dept_name VARCHAR(255), father_id VARCHAR(10)); DELETE FROM tmpLst; CREATE TEMPORARY TABLE IF NOT EXISTS tmpInsert (dept_id VARCHAR(10) PRIMARY KEY, dept_name VARCHAR(255), father_id VARCHAR(10)); DELETE FROM tmpInsert; INSERT INTO tmpInsert SELECT telephone_id AS dept_id,telephone AS dept_name,Employee_id AS father_id FROM telephone ; INSERT INTO tmpLst SELECT * FROM tmpInsert; OPEN cur_tel; FETCH cur_tel INTO father_tel; WHILE done_tel <> 1 DO INSERT INTO tmpLst SELECT Employee_id AS dept_id ,Employee_name AS dept_name,dept_id AS father_id FROM employee WHERE Employee_id = father_tel; /*delete from bi.tmp_dt_fee_user_info where imei=father_seal;*/ FETCH cur_tel INTO father_tel; END WHILE; CLOSE cur_tel; SET done_tel = 0; OPEN cur_emp; FETCH cur_emp INTO father_emp; WHILE done_tel <> 1 DO CALL getParentByChild(father_emp); FETCH cur_emp INTO father_emp; END WHILE; CLOSE cur_emp; SELECT tmpLst.* FROM tmpLst; END$$ DELIMITER ;
存储过程:getParentByChild(childId)
DELIMITER $$ USE `test`$$ DROP PROCEDURE IF EXISTS `getParentByChild`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `getParentByChild`(IN childId VARCHAR(255)) BEGIN DECLARE done INT DEFAULT 0; DECLARE b VARCHAR(255); DECLARE coun INT; DECLARE cur1 CURSOR FOR SELECT father_id FROM dept WHERE dept_id = childId; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET max_sp_recursion_depth=255; SET coun = (SELECT COUNT(*) FROM tmpLst WHERE dept_id = childId); IF coun = 0 THEN IF childId = 0 THEN INSERT INTO tmpLst SELECT * FROM dept WHERE dept_id = childId; ELSE OPEN cur1; FETCH cur1 INTO b; WHILE done <> 1 DO CALL getParentByChild(b); INSERT INTO tmpLst SELECT * FROM dept WHERE dept_id = childId; SET done = 1; END WHILE; CLOSE cur1; END IF; END IF; END$$ DELIMITER ;
PS:以上代码是通过SQLyog写的。
第四道菜:代码运行效果
所要的需求达到了!
如果其他小伙伴有更好的方法,请告知!
参考:http://blog.csdn.net/ACMAIN_CHM/article/details/4142971
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复