MySQL中实现递归查询

摘要:
对于数据库中的树形结构数据,例如部门表,有时我们需要知道一个部门的所有下属部门或一个部门中的所有上级部门。在这种情况下,我们需要使用MySQL的递归查询。1.创建表格,按Ctrl+C复制代码,按Ctrl+C复制代码。2.初始数据INSERT TO `t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入`t_areinfo`VALUES;插入,插入

对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询

1、创建表

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

2、初始数据

复制代码
INSERT INTO `t_areainfo` VALUES ('1', '0', '中国', '0', '0');
INSERT INTO `t_areainfo` VALUES ('2', '0', '华北区', '1', '0');
INSERT INTO `t_areainfo` VALUES ('3', '0', '华南区', '1', '0');
INSERT INTO `t_areainfo` VALUES ('4', '0', '北京', '2', '0');
INSERT INTO `t_areainfo` VALUES ('5', '0', '海淀区', '4', '0');
INSERT INTO `t_areainfo` VALUES ('6', '0', '丰台区', '4', '0');
INSERT INTO `t_areainfo` VALUES ('7', '0', '朝阳区', '4', '0');
INSERT INTO `t_areainfo` VALUES ('8', '0', '北京XX区1', '4', '0');
INSERT INTO `t_areainfo` VALUES ('9', '0', '北京XX区2', '4', '0');
INSERT INTO `t_areainfo` VALUES ('10', '0', '北京XX区3', '4', '0');
INSERT INTO `t_areainfo` VALUES ('11', '0', '北京XX区4', '4', '0');
INSERT INTO `t_areainfo` VALUES ('12', '0', '北京XX区5', '4', '0');
INSERT INTO `t_areainfo` VALUES ('13', '0', '北京XX区6', '4', '0');
INSERT INTO `t_areainfo` VALUES ('14', '0', '北京XX区7', '4', '0');
INSERT INTO `t_areainfo` VALUES ('15', '0', '北京XX区8', '4', '0');
INSERT INTO `t_areainfo` VALUES ('16', '0', '北京XX区9', '4', '0');
INSERT INTO `t_areainfo` VALUES ('17', '0', '北京XX区10', '4', '0');
INSERT INTO `t_areainfo` VALUES ('18', '0', '北京XX区11', '4', '0');
INSERT INTO `t_areainfo` VALUES ('19', '0', '北京XX区12', '4', '0');
INSERT INTO `t_areainfo` VALUES ('20', '0', '北京XX区13', '4', '0');
INSERT INTO `t_areainfo` VALUES ('21', '0', '北京XX区14', '4', '0');
INSERT INTO `t_areainfo` VALUES ('22', '0', '北京XX区15', '4', '0');
INSERT INTO `t_areainfo` VALUES ('23', '0', '北京XX区16', '4', '0');
INSERT INTO `t_areainfo` VALUES ('24', '0', '北京XX区17', '4', '0');
INSERT INTO `t_areainfo` VALUES ('25', '0', '北京XX区18', '4', '0');
INSERT INTO `t_areainfo` VALUES ('26', '0', '北京XX区19', '4', '0');
INSERT INTO `t_areainfo` VALUES ('27', '0', '北京XX区1', '4', '0');
INSERT INTO `t_areainfo` VALUES ('28', '0', '北京XX区2', '4', '0');
INSERT INTO `t_areainfo` VALUES ('29', '0', '北京XX区3', '4', '0');
INSERT INTO `t_areainfo` VALUES ('30', '0', '北京XX区4', '4', '0');
INSERT INTO `t_areainfo` VALUES ('31', '0', '北京XX区5', '4', '0');
INSERT INTO `t_areainfo` VALUES ('32', '0', '北京XX区6', '4', '0');
INSERT INTO `t_areainfo` VALUES ('33', '0', '北京XX区7', '4', '0');
INSERT INTO `t_areainfo` VALUES ('34', '0', '北京XX区8', '4', '0');
INSERT INTO `t_areainfo` VALUES ('35', '0', '北京XX区9', '4', '0');
INSERT INTO `t_areainfo` VALUES ('36', '0', '北京XX区10', '4', '0');
INSERT INTO `t_areainfo` VALUES ('37', '0', '北京XX区11', '4', '0');
INSERT INTO `t_areainfo` VALUES ('38', '0', '北京XX区12', '4', '0');
INSERT INTO `t_areainfo` VALUES ('39', '0', '北京XX区13', '4', '0');
INSERT INTO `t_areainfo` VALUES ('40', '0', '北京XX区14', '4', '0');
INSERT INTO `t_areainfo` VALUES ('41', '0', '北京XX区15', '4', '0');
INSERT INTO `t_areainfo` VALUES ('42', '0', '北京XX区16', '4', '0');
INSERT INTO `t_areainfo` VALUES ('43', '0', '北京XX区17', '4', '0');
INSERT INTO `t_areainfo` VALUES ('44', '0', '北京XX区18', '4', '0');
INSERT INTO `t_areainfo` VALUES ('45', '0', '北京XX区19', '4', '0');
INSERT INTO `t_areainfo` VALUES ('46', '0', 'xx省1', '1', '0');
INSERT INTO `t_areainfo` VALUES ('47', '0', 'xx省2', '1', '0');
INSERT INTO `t_areainfo` VALUES ('48', '0', 'xx省3', '1', '0');
INSERT INTO `t_areainfo` VALUES ('49', '0', 'xx省4', '1', '0');
INSERT INTO `t_areainfo` VALUES ('50', '0', 'xx省5', '1', '0');
INSERT INTO `t_areainfo` VALUES ('51', '0', 'xx省6', '1', '0');
INSERT INTO `t_areainfo` VALUES ('52', '0', 'xx省7', '1', '0');
INSERT INTO `t_areainfo` VALUES ('53', '0', 'xx省8', '1', '0');
INSERT INTO `t_areainfo` VALUES ('54', '0', 'xx省9', '1', '0');
INSERT INTO `t_areainfo` VALUES ('55', '0', 'xx省10', '1', '0');
INSERT INTO `t_areainfo` VALUES ('56', '0', 'xx省11', '1', '0');
INSERT INTO `t_areainfo` VALUES ('57', '0', 'xx省12', '1', '0');
INSERT INTO `t_areainfo` VALUES ('58', '0', 'xx省13', '1', '0');
INSERT INTO `t_areainfo` VALUES ('59', '0', 'xx省14', '1', '0');
INSERT INTO `t_areainfo` VALUES ('60', '0', 'xx省15', '1', '0');
INSERT INTO `t_areainfo` VALUES ('61', '0', 'xx省16', '1', '0');
INSERT INTO `t_areainfo` VALUES ('62', '0', 'xx省17', '1', '0');
INSERT INTO `t_areainfo` VALUES ('63', '0', 'xx省18', '1', '0');
INSERT INTO `t_areainfo` VALUES ('64', '0', 'xx省19', '1', '0');
复制代码

3、向下递归

利用find_in_set()函数和group_concat()函数实现递归查询:

复制代码
DROP FUNCTION IF EXISTS queryChildrenAreaInfo;
DELIMITER ;; CREATE FUNCTION queryChildrenAreaInfo(areaId INT) RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); WHILE sTempChd IS NOT NULL DO SET sTemp= CONCAT(sTemp,',',sTempChd); SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId,sTempChd)>0; END WHILE; RETURN sTemp; END
;;
DELIMITER ;
复制代码

4、调用方式

SELECT queryChildrenAreaInfo(1);

MySQL中实现递归查询第5张

查询id为"4"下面的所有节点

SELECT * FROM t_areainfo WHERE FIND_IN_SET(id,queryChildrenAreaInfo(4));

MySQL中实现递归查询第6张

5、向上递归

复制代码
DROP FUNCTION IF EXISTS queryChildrenAreaInfo1;
DELIMITER;; CREATE FUNCTION queryChildrenAreaInfo1(areaId INT) RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); SET sTemp = CONCAT(sTemp,',',sTempChd); SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd; WHILE sTempChd <> 0 DO SET sTemp = CONCAT(sTemp,',',sTempChd); SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd; END WHILE; RETURN sTemp; END
;;
DELIMITER ;
复制代码

6、调用方式

查询id为"7"的节点的所有上级节点:

SELECT * from t_areainfo where FIND_IN_SET(id,queryChildrenAreaInfo1(7));

MySQL中实现递归查询第9张

 
 

免责声明:文章转载自《MySQL中实现递归查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#WinformSettings.setting配置vuejs绑定img 的src下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL学习笔记:字符串前后补全0

  遇到一个需求:不足6位的需要自动补全6位,使用函数LPAD()和RPAD()补全。   LPAD(str, len, padstr)   用字符串padstr对str进行左边填充补全直至它的长度达到len个字符,返回str。 一、前补0(左补0) SELECT LPAD(id,6,0) AS TIME FROM test;   结果:    二、后补0...

mysql 删除重复数据只保留一条记录

删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id from order_info group by order_number) as b); delete from table where id not in...

mysql-community-server-5.7.24 &amp;amp; 5.7.31 (5.6.35 升级到 5.7.24)

阶段1: rpm -qa | grep mysql wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.24-1.el6.x86_64.rpm-bundle.tar wget https://cdn.mysql.com/archives/mysql-5.7/mysql-community-serv...

java相关环境配置

1.安装JDK的步骤: 1.sh jdk_6u10_rpm.bin 2.配置环境变量: vi /etc/profile export JAVA_HOME=/usr/java/jdk1.6.0_10 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/lib 3.注销 4.java -...

关于mysql installer 的安装和环境变量配置

MySQL针对不同的用户提供了2中不同的版本: MySQL Community Server:社区版。由MySQL开源社区开发者和爱好者提供技术支持,对开发者开放源代码并提供免费下载。 MySQL Enterprise Server:企业版。包括最全面的高级功能和管理工具,不过对用户收费。 下面讲到的MySQL安装都是以免费开源的社区版为基础。打开My...

MySQL之关系映射

数据库的关系一般是用于描述多张表之间的关系。 主要分为: 一对一 一对多 多对多 而不管表与表之间是哪种关系,在创建关联时都需要通过外键(FOREIGN KEY)进行约束,以保证数据的统一性。外键通常都是与另一张表的主键进行关联的。 一、一对一关系一对一关系是指一张表中的一条数据对应另一张表中的唯一一条数据。 例如下面的用户与用户详情表。 用户表: C...