mysql 遞歸函數

業務描述:服務器

選擇部門時顯示部門下面使用部門員工信息函數

 

部門數據:測試

1spa

2code

3遞歸

4ci

5開發

6it

7io

8

9

10

11

12

13

14

15

16

17

DROP TABLE IF EXISTS `department`;

CREATE TABLE `department` (

  `Id` int(11) NOT NULL AUTO_INCREMENT,

  `Namevarchar(50) NOT NULL,

  `ParentId` int(11) NOT NULL DEFAULT '-1',

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8;

 

-- ----------------------------

-- Records of department

-- ----------------------------

INSERT INTO `department` VALUES ('38''XXX總公司''34');

INSERT INTO `department` VALUES ('39''服務器端開發組''38');

INSERT INTO `department` VALUES ('40''XXX分公司''-1');

INSERT INTO `department` VALUES ('44''財務部''40');

INSERT INTO `department` VALUES ('46''IOS開發組''38');

INSERT INTO `department` VALUES ('47''Android 開發組''38');

部門用戶:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

DROP TABLE IF EXISTS `employee_basic`;

CREATE TABLE `employee_basic` (

  `Id` int(11) NOT NULL AUTO_INCREMENT,

  `Namevarchar(20) NOT NULL COMMENT '員工姓名',

  `EmpNo` varchar(20) NOT NULL DEFAULT '暫無' COMMENT '員工編號',

  `Email` varchar(50) NOT NULL COMMENT '員工郵箱',

  `Position` varchar(20) NOT NULL COMMENT '職位',

  `Sex` int(11) NOT NULL COMMENT '1-男,2-女',

  `Birthday` date NOT NULL COMMENT '員工生日',

  `EntryTime` date NOT NULL COMMENT '入職時間',

  `DepartmentId` int(11) NOT NULL,

  `School` varchar(30) DEFAULT '' COMMENT '畢業院校',

  `Phone` varchar(15) DEFAULT '' COMMENT '電話',

  `Address` varchar(30) DEFAULT '' COMMENT '地址',

  `EmergencyMan` varchar(20) DEFAULT NULL,

  `EmergencyPhone` varchar(15) DEFAULT NULL,

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

 

-- ----------------------------

-- Records of employee_basic

-- ----------------------------

INSERT INTO `employee_basic` VALUES ('18''羅AAA''暫無''yangtie@AAAA.com''CTO''1''2015-06-16''2015-06-18''39''暨南大學''1888888888''十五''羅AAA''111');

INSERT INTO `employee_basic` VALUES ('21''楊BBB''暫無''yangtie@AAAA.com''職員''1''2015-06-19''2015-05-13''39''中山大學''1888888888''111111111111111111111111111111''楊BBB''1888888888');

INSERT INTO `employee_basic` VALUES ('22''唐CCC''暫無''yangtie@AAAA.com''測試''1''2015-06-22''2015-06-23''44''中山大學''1888888888''前山前山前山前山前山前真''唐CCC''1888888888');

INSERT INTO `employee_basic` VALUES ('23''鄧DDD''暫無''280591505@AAA.com''開發經理''1''2015-04-20''2015-05-01''46''桂林大學''1888888888''珠海市香洲青竹商務5205''鄧DDD''1888888888');

INSERT INTO `employee_basic` VALUES ('24''陳FFF''暫無''280591505@AAA.com''開發''2''2015-06-20''2014-01-01''46''珠海大學''1888888888''珠海''陳FFF''1888888888');鄧DDD

INSERT INTO `employee_basic` VALUES ('28''唐EEE''暫無''11@AAAA.com''11''1''2015-06-08''2015-06-01''47''111''11''111''唐EEE''111');

INSERT INTO `employee_basic` VALUES ('29''李GGG''暫無''88@AAAA.com''88''2''2015-07-01''2015-07-01''47''888''88''88''李GGG''88');

  

 

遞歸查詢函數:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

ROP FUNCTION IF EXISTS queryChildrenIds;

CREATE FUNCTION `queryChildrenIds` (dId INT)

RETURNS VARCHAR(4000)

BEGIN

DECLARE sTemp VARCHAR(4000);

DECLARE sTempChd VARCHAR(4000);

 

SET sTemp = '$';

SET sTempChd = cast(dId as char);

 

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp,',',sTempChd);

SELECT group_concat(id) INTO sTempChd FROM department where FIND_IN_SET(ParentId,sTempChd)>0;

END WHILE;

return sTemp;

END;

測試查詢結果:

1

<br>SELECT   queryChildrenIds(38)

1

SELECT e.* FROM employee_basic e INNER JOIN department d ON e.DepartmentId=d.Id where FIND_IN_SET(e.DepartmentId, queryChildrenIds(38));

相關文章
相關標籤/搜索