前言
说明
一张school表,字段有主键id和父层级id,大学是最高的一个父节点,降序排序就是:大学>高中>小学>幼儿园,根据mysql8递归函数,可实现根据不同节点向上或者向下查询所有有关联的节点。
效果图
- 根据父节点递归向下查询所有子节点
- 根据子节点向上递归查询所有父节点
初始化表结构和数据
表结构
CREATE TABLE `school` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`parent_id` int(11) NOT NULL COMMENT '父层级id',
`sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
插入示范数据
INSERT INTO `test`.`school`(`id`, `parent_id`, `sname`) VALUES (1, -1, '大学');
INSERT INTO `test`.`school`(`id`, `parent_id`, `sname`) VALUES (2, 1, '高中');
INSERT INTO `test`.`school`(`id`, `parent_id`, `sname`) VALUES (3, 2, '小学');
INSERT INTO `test`.`school`(`id`, `parent_id`, `sname`) VALUES (4, 3, '幼儿园');
SQL实现
父节点向下递归所有子节点
WITH RECURSIVE r_t AS (
SELECT
s1.id,
s1.parent_id,
s1.sname
FROM
school s1
WHERE
s1.id = 1 UNION ALL
SELECT
s2.id,
s2.parent_id,
s2.sname
FROM
school s2
INNER JOIN r_t ON r_t.id = s2.parent_id
) SELECT
*
FROM
r_t;
子节点向上递归所有父节点
WITH RECURSIVE r_t AS (
SELECT
s1.id,
s1.parent_id,
s1.sname
FROM
school s1
WHERE
s1.id = 4 UNION ALL
SELECT
s2.id,
s2.parent_id,
s2.sname
FROM
school s2
INNER JOIN r_t ON r_t.parent_id = s2.id
) SELECT
*
FROM
r_t;
就
先
说
到
这
\color{#008B8B}{ 就先说到这}
就先说到这
在
下
A
p
o
l
l
o
\color{#008B8B}{在下Apollo}
在下Apollo
一
个
爱
分
享
J
a
v
a
、
生
活
的
小
人
物
,
\color{#008B8B}{一个爱分享Java、生活的小人物,}
一个爱分享Java、生活的小人物,
咱
们
来
日
方
长
,
有
缘
江
湖
再
见
,
告
辞
!
\color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!}
咱们来日方长,有缘江湖再见,告辞!