MySQL 递归查询下级

发布于:2023-01-04 ⋅ 阅读:(293) ⋅ 点赞:(0)

创建数据表

CREATE TABLE `area` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL COMMENT '地区名',
  `level` tinyint(2) DEFAULT NULL COMMENT '区域等级',
  `parent` int(9) DEFAULT NULL COMMENT '父级地区ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;

插入数据

BEGIN;
INSERT INTO `area` VALUES (1, '中国', 1, 0);
INSERT INTO `area` VALUES (4, '杭州', 3, 20);
INSERT INTO `area` VALUES (5, '成都市', 3, 10);
INSERT INTO `area` VALUES (6, '双流区', 4, 5);
INSERT INTO `area` VALUES (7, '武侯区', 4, 5);
INSERT INTO `area` VALUES (8, '锦江区', 4, 5);
INSERT INTO `area` VALUES (9, '青羊区', 4, 5);
INSERT INTO `area` VALUES (10, '四川省', 2, 1);
INSERT INTO `area` VALUES (11, '成华区', 4, 5);
INSERT INTO `area` VALUES (12, '上城区', 4, 4);
INSERT INTO `area` VALUES (13, '拱墅区', 4, 4);
INSERT INTO `area` VALUES (14, '西湖区', 4, 4);
INSERT INTO `area` VALUES (15, '滨江区', 4, 4);
INSERT INTO `area` VALUES (16, '萧山区', 4, 4);
INSERT INTO `area` VALUES (17, '宁波', 3, 20);
INSERT INTO `area` VALUES (18, '海曙区', 4, 17);
INSERT INTO `area` VALUES (19, '江北区', 4, 17);
INSERT INTO `area` VALUES (20, '浙江省', 2, 1);
INSERT INTO `area` VALUES (21, '镇海区', 4, 17);
INSERT INTO `area` VALUES (22, '北仑区', 4, 17);
INSERT INTO `area` VALUES (23, '鄞州区', 4, 17);
INSERT INTO `area` VALUES (24, '奉化区', 4, 17);
INSERT INTO `area` VALUES (25, '南充市', 3, 10);
INSERT INTO `area` VALUES (26, '南部县', 4, 25);
INSERT INTO `area` VALUES (27, '顺庆区', 4, 25);
INSERT INTO `area` VALUES (28, '高坪区', 4, 25);
INSERT INTO `area` VALUES (29, '嘉陵区', 4, 25);
INSERT INTO `area` VALUES (30, '阆中市', 4, 25);
INSERT INTO `area` VALUES (31, '西充县', 4, 25);
INSERT INTO `area` VALUES (32, '蓬安县', 4, 25);
INSERT INTO `area` VALUES (33, '营山县', 4, 25);
COMMIT;

递归查询

SELECT
	id,
	`name`,
	`level`,
	parent 
FROM
	(
	SELECT
		t1.*,
	IF
		(
			FIND_IN_SET( parent, @pids ) > 0,
			@pids :=
		IF
			( FIND_IN_SET( id, @pids ) <= 0, CONCAT( @pids, ',', id ), @pids ),
			0 
		) AS ischild 
	FROM
		( SELECT * FROM area ORDER BY `level`, id ) t1,
		( SELECT @pids := 10 ) t2 
	HAVING
	ischild != 0 
	) AS t3

大家若要使用的话,将( SELECT @pids := 10 ) t2 中的 10 替换成你想要查询的地区就可以了,当然表结构不同的需要将对应字段进行替换哈。我这里查询的是 ID 为10 的四川省的所有下级,结果如下

5	成都市	3	10
25	南充市	3	10
6	双流区	4	5
7	武侯区	4	5
8	锦江区	4	5
9	青羊区	4	5
11	成华区	4	5
26	南部县	4	25
27	顺庆区	4	25
28	高坪区	4	25
29	嘉陵区	4	25
30	阆中市	4	25
31	西充县	4	25
32	蓬安县	4	25
33	营山县	4	25

欢迎访问我的博客 原文地址


网站公告

今日签到

点亮在社区的每一天
去签到