MySQL8-WITH RECURSIVE递归查询父子集

本文介绍了在MySQL8.0中使用WITH RECURSIVE查询语句来实现父子集的查询,包括从父找子和从子找父的场景。通过创建地址表并初始化数据,展示了如何查询西安市的所有子区域以及北客站的所有上级区域。
摘要由CSDN通过智能技术生成

开发过程中遇到查询所有父子集,不同数据库中实现方式也不同,本文使用Mysql数据库,版本为8.0

1、构件表

1)创建地址表,字段分别为id、父级id、名称

CREATE TABLE `t_address`  (
  `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `parent_id` int NOT NULL COMMENT '父级ID',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2)数据初始化

INSERT INTO `t_address` VALUES (1, 0, '陕西省');
INSERT INTO `t_address` VALUES (2, 1, '西安市');
INSERT INTO `t_address` VALUES (3, 1, '咸阳市');
INSERT INTO `t_address` VALUES (4, 3, '秦都区');
INSERT INTO `t_address` VALUES (5, 2, '未央区');
INSERT INTO `t_address` VALUES (6, 2, '雁塔区');
INSERT INTO `t_address` VALUES (7, 2, '莲湖区');
INSERT INTO `t_address` VALUES (8, 6, '大雁塔');
INSERT INTO `t_address` VALUES (9, 6, '科技路');
INSERT INTO `t_address` VALUES (10, 7, '玉祥门');
INSERT INTO `t_address` VALUES (11, 5, '北客站');
INSERT INTO `t_address` VALUES (12, 4, '咸阳湖');

2、查询所有子集(父求子)

1)需求:查询出西安市底下所有区域

with recursive temp as
(	
	select * from t_address where name = '西安市'
	union all
	select ta.* from t_address ta join temp on ta.parent_id = temp.id
)
select * from temp

2)结果如下

在这里插入图片描述

3、查询所有父集(子求父)

1)需求:查询出北客站所有父级

with recursive temp as
(	
	select * from t_address where `name` = '北客站'
	union all
	select ta.* from t_address ta join temp on ta.id = temp.parent_id
)
select * from temp;

2)结果如下

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值