MySql根据id递归向下查询所有子级

本文介绍了一种通过SQL查询树形结构数据的方法,适用于具有层级关系的数据表。示例提供了在MySQL中查询指定id所有子级的SQL语句,并给出了在不同版本MySQL中的适用性提示。此外,还分享了查询特定节点所有子节点而不包括自身的优化SQL语句。请注意在实际使用前确认数据库版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 通过id递归向下查询所有子级,适用于树表结构查询,亲测好用

如果对你有用,结尾处 三连 鼓励一下,感谢 ! 

SELECT
	ID.LEVEL,
	DATA.* 
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( id ) FROM 表名 WHERE FIND_IN_SET( 父级 id字段, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		表名,
		( SELECT @ids := '条件id', @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 
	) ID,
	表名 DATA 
WHERE
	FIND_IN_SET( DATA.id, ID._ids ) 
ORDER BY
	LEVEL,
	id

示例:

SELECT
	DATA.* 
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( id ) FROM TblTeacherEvaluateRuleInfo WHERE FIND_IN_SET( parentId, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		TblTeacherEvaluateRuleInfo,
		( SELECT @ids := 1, @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 
	) ID,
	TblTeacherEvaluateRuleInfo DATA 
WHERE
	FIND_IN_SET( DATA.id, ID._ids ) 
ORDER BY
	id DESC

结果:

字段注释:

以上版本不适用MySQL8.0版本,可以参考下边这个版本

------------------------------------------------------分割线-----------------------------------------------------------------

SELECT
    id
FROM
    (
        SELECT
            t1.id,
            t1.parent_id,
        IF (
            find_in_set(parent_id, @pids) > 0,
            @pids := concat(@pids, ',', id),
            0
        ) AS childList
        FROM
            (
                SELECT
                    t.节点id as id,
                    t.节点父id AS parent_id
                FROM
                    表名 t
                ORDER BY
                    t.parentCode,
                    t.code
            ) t1,
            (SELECT @pids := '查询节点标识') t2
    ) t3
WHERE
    childList != 0;

示例SQL和结果

 查询节点id:上图示例就会查询出id为8的所有孩子节点,

注: 此SQL不会查询自己,只会查询所有子节点

上线前切记线上数据库版本,血的教训

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值