SQL: Recursive query in MySQL

DROP TABLE IF EXISTS `dudept`;
CREATE TABLE `dudept`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT comment ‘ID‘,
  `deptCode` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL comment‘‘,
  `deptName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL comment‘‘,
  `pCode` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL comment‘‘,
  `ParentId`int(11) not null comment ‘Parent ID‘,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1000‘, ‘六福集团‘, NULL,0);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1001‘, ‘六福珠宝(北京)公司‘, ‘1000‘,1);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1002‘, ‘六福珠宝(上海)公司‘, ‘1000‘,1);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1003‘, ‘北京资讯科技部‘, ‘1001‘,2);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1004‘, ‘北京财务部‘, ‘1001‘,2);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1005‘, ‘北京营销推广部‘, ‘1001‘,2);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1006‘, ‘北京资讯科技一部‘, ‘1003‘,4);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1007‘, ‘北京资讯科技二部‘, ‘1003‘,4);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1008‘, ‘北京资讯科技一部一小组‘, ‘1006‘,7);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1009‘, ‘北京资讯科技一部二小组‘, ‘1006‘,7);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1010‘, ‘北京资讯科技二部一小组‘, ‘1007‘,8);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1011‘, ‘北京资讯科技二部二小组‘, ‘1007‘,8);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1012‘, ‘北京营销推广一部‘, ‘1005‘,6);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1013‘, ‘上海资讯科技部‘, ‘1002‘,3);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1014‘, ‘上海资讯科技研发一部‘, ‘1013‘,14);
INSERT INTO `dudept`(`deptCode`, `deptName`, `pCode`,`ParentId`) VALUES (‘1015‘, ‘上海资讯科技研发二部‘, ‘1013‘,14);


-- Oracle 递归查询 geovindu Geovin Du 涂聚文
/*
prior 在子节点端(向下递归)
第一种情况:start with 子节点id = ‘ 查询节点 ‘ connect by prior 子节点id = 父节点id
select * from dudept start with deptCode=‘1001‘ connet by prior deptCode=pCode;
第二种情况:start with 父节点id= ‘ 查询节点 ‘  connect by prior 子节点id = 父节点 id
select * from dudept start with deptCode=‘1001‘ connect by prior deptCode=pCode;
prior 在父节点端(向上递归)
第三种情况:start with 子节点id= ‘ 查询节点 ‘ connect by prior 父节点id = 子节点id
select * from dudept start with deptCode=‘1001‘ connect by prior pCode=deptCode;
第四种情况:start with 父节点id= ‘ 查询节点 ‘ connect by prior 父节点id = 子节点id
select * from dudept start with deptCode=‘1001‘ connect by prior pCode=deptCode;

*/

select * from dudept;
-- concat,concat_ws,group_concat 函数
select FIND_IN_SET(‘b‘,‘a,b,c,d‘);

select * from dudept where FIND_IN_SET(deptCode,‘1000,1001,1002‘);

select CONCAT(‘M‘,‘Y‘,‘S‘,‘Q‘,‘L‘) from dual; 

select group_concat(deptCode) from dudept;


select * from dudept where FIND_IN_SET(Id,‘1,2,3‘);

#部门函数
DELIMITER $$
DROP FUNCTION IF EXISTS `f_GetDepartmentName` $$
CREATE FUNCTION `f_GetDepartmentName` (did int) RETURNS varchar(100)
    READS SQL DATA
    DETERMINISTIC
BEGIN
declare str varchar(100);
return(select deptName from dudept where Id=did);
END $$
DELIMITER ;

select f_GetDepartmentName(1);


-- MySQL 自定义函数,实现递归查询
delimiter $$ 
drop function if exists `getChildList` $$ 
create function `getChildList` (duId varchar(50)) returns varchar(1000) 
    READS SQL DATA
    DETERMINISTIC
begin 
 -- declare duId varchar(10) default ‘1003‘;
 declare ids varchar(1000) default ‘‘; 
 declare tempids varchar(1000);
 set duId=‘1003‘;
 set tempids = duId; 
 while tempids is not null do 
  set ids = CONCAT_WS(‘,‘,ids,tempids); 
  select GROUP_CONCAT(deptCode) into tempids from dudept where FIND_IN_SET(pCode,tempids)>0;  
 end while; 
 -- select ids;
 
 return ids; 
end;
$$ 
delimiter ; 

 select getChildList(‘1001‘);
 
select * from dudept where FIND_IN_SET(deptCode,getChildList(‘1001‘));


# ID 查询
delimiter $$ 
drop function if exists `getChildListId` $$ 
create function `getChildListId` (duId int) returns varchar(1000) 
    READS SQL DATA
    DETERMINISTIC
begin 
 -- declare duId varchar(10) default ‘1003‘;
 declare ids varchar(1000) default ‘‘; 
 declare tempids varchar(1000);
 -- set duId=‘1003‘;
 set tempids = duId; 
 while tempids is not null do 
  set ids = CONCAT_WS(‘,‘,ids,tempids); 
  select GROUP_CONCAT(Id) into tempids from dudept where FIND_IN_SET(ParentId,tempids)>0;  
 end while; 
 -- select ids; 
 return ids; 
end;
$$ 
delimiter ; 

 select getChildListId(4);
 
 select * from dudept where FIND_IN_SET(Id,getChildListId(4));
 
 

-- 手动实现递归查询(向上递归)
delimiter $$ 
drop function if exists `getParentList` $$ 
create function `getParentList` (duId varchar(10)) returns varchar(1000) 
    READS SQL DATA
    DETERMINISTIC
begin 
 declare ids varchar(1000); 
 declare tempid varchar(10); 
  
 set tempid = duId; 
 while tempid is not null do 
  set ids = CONCAT_WS(‘,‘,ids,tempid); 
  select pCode into tempid from dudept where deptCode=tempid; 
 end while; 
 return ids; 
end;
$$ 
delimiter ;

select getParentList(‘1001‘);
 
select * from dudept where FIND_IN_SET(deptCode,getParentList(‘1001‘));

# ID 查询
delimiter $$ 
drop function if exists `getParentListId` $$ 
create function `getParentListId` (duId int) returns varchar(1000) 
    READS SQL DATA
    DETERMINISTIC
begin 
 declare ids varchar(100); 
 declare tempid varchar(100);  
 set ids=‘$‘;
 set tempid = CAST(duId as char);
 --  set ids = CONCAT_WS(‘,‘,ids,tempid); 
SET ids = CONCAT(ids,‘,‘,tempid);
SELECT ParentId INTO tempid FROM dudept WHERE Id = tempid;
 while tempid  <> 0 DO  
 --    set ids = CONCAT_WS(‘,‘,ids,tempid); 
  SET ids = CONCAT(ids,‘,‘,tempid);
SELECT ParentId INTO tempid FROM dudept WHERE Id = tempid; 
 end while; 
 return ids; 
end;
$$ 
delimiter ;

delimiter $$ 
drop function if exists `getParentListId` $$ 
create function `getParentListId` (duId varchar(10)) returns varchar(1000) 
    READS SQL DATA
    DETERMINISTIC
begin 
 declare ids varchar(1000); 
 declare tempid varchar(100);   
 set tempid = CAST(duId as char(5)); 
 while tempid <> 0 DO 
  set ids = CONCAT_WS(‘,‘,ids,tempid); 
  select ParentId into tempid from dudept where Id=tempid; 
 end while; 
 return ids; 
end;
$$ 
delimiter ;


-- Geovin Du
select getParentListId(4);
 
 select * from dudept where FIND_IN_SET(Id,getParentListId(4));
 

  

SQL: Recursive query in MySQL

上一篇:pgsql upsert语法


下一篇:SQL命令备忘