您的位置:首页 > 数据库 > MySQL

MySql 通过子类倒查父类

2016-06-02 17:40 633 查看
前段时间客户提出一个需求:显示有设备信息的部门,没有设备信息的隐藏。这个问题确实很简单,但是表结构是这样的。。。。根据《中华人民共和国**法》,我将需求改成可以“欣赏”的,以备其他同学使用。

第一道菜:表结构:

公司表:



员工表:



电话表:



第二道菜:需求

将拥有电话员工的部门按照树的形式展示出来。

第三道菜: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