MySql语句查询某一级节点的所有子节点
在日常项目中,我们总能用到树型结构的数据,我们用代码去进行查询是比较麻烦的,这里提供一种sql语句查询父节点和子节点的方法。
说明:只能当前节点查出所有子节点,不包含与当前节点平级的节点,且子节点是全部返回,并没有分层分级。
1、表结构----建表语句
CREATE TABLE `group` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`parent_id` bigint(20) NOT NULL,
`subsystem_id` int(11) NOT NULL,
`group_name` varchar(60) NOT NULL,
`create_time` datetime NOT NULL,
`description` varchar(256) DEFAULT NULL,
`available` bit(1) NOT NULL DEFAULT b'1' COMMENT '0::false,1:true',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='组';
2、表结构----数据
数据说明:
举例:
平台级角色组的id为1,那他的子节点包含2,4,3
企业域级角色组id为2,那他的子节点包含3
3、SQL语句模板
select id from (
select t1.id,
if(find_in_set(父级id字段名, @pids) > 0, @pids := concat(@pids, ',', 主键id字段名), -1) as ischild
from (
select 主键id字段名,父级id字段名 from 表名 t order by 父级id字段名, 主键id字段名
) t1,
(select @pids := 需要查询的主键id) t2
) t3 where ischild != -1
语句说明:
首先分析from后面的语句,根据parent_id和id 排序,并将要查询的菜单节点当做变量,from后面的结果为
接下来看if(express1,express2,express3)条件语句,if语句类似三目运算符,当exprss1成立时,执行express2,否则执行express3;
FIND_IN_SET(str,strlist),str 要查询的字符串,strlist 字段名 参数以”,”分隔 如 (1,2,6,8),查询字段(strlist)中包含(str)的结果,返回结果为null或记录
如果parent_id 在@pid中,则将@pid 里面再加上parent_id,按行依次执行
此时执行的sql:
SELECT
t1.id,t1.group_name,
IF
( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), -1 ) AS ischild
FROM
( SELECT id, parent_id,group_name FROM `group` t ORDER BY parent_id, id ) t1,
( SELECT @pids := 1 ) t2
执行过程如下表所示:
4、查询举例
4.1 查询平台级角色组(id=1)下级组
SELECT
id ,group_name
FROM
(
SELECT
t1.id,t1.group_name,
IF
( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), -1 ) AS ischild
FROM
( SELECT id, parent_id,group_name FROM `group` t ORDER BY parent_id, id ) t1,
( SELECT @pids := 1 ) t2
) t3
WHERE
ischild != -1
结果:
4.2 查询企业级角色组(id=2)下级组
SELECT
id ,group_name
FROM
(
SELECT
t1.id,t1.group_name,
IF
( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), -1 ) AS ischild
FROM
( SELECT id, parent_id,group_name FROM `group` t ORDER BY parent_id, id ) t1,
( SELECT @pids := 2 ) t2
) t3
WHERE
ischild != -1
结果: