MySQL父查询子、子查询父

本文详细介绍了如何使用SQL查询父子节点关系,包括根据父节点查询所有子节点ID及根据子节点ID逆向查询父节点的方法。通过具体示例,展示了如何创建函数实现递归查询,适用于需要处理树状结构数据的场景。

一、根据父查询子

1、sql实现

SELECT GROUP_CONCAT(id) id FROM (
		SELECT t1.*,IF(FIND_IN_SET(parentid, @pids) > 0, @pids := CONCAT(@pids, ',', id), '0') AS ischild
		FROM (SELECT * FROM test ORDER BY id ASC) t1,(SELECT @pids := '变量父ID') t2
) t3 WHERE ischild != '0'

需修改的变量:id:主键id、parentid:父id、test:表名。

2、函数实现

2.1、创建函数

CREATE DEFINER=`bd_db_admin`@`%` FUNCTION `getChildId`(`pId` bigint) RETURNS varchar(4000) CHARSET utf8
BEGIN
	#Routine body goes here...
	DECLARE ids VARCHAR(4000);
	DECLARE childId VARCHAR(4000);

	SET ids = '$';
	SET childId = CAST(pId AS CHAR);
	
	WHILE childId is NOT NULL DO
	SET ids = CONCAT(ids,',',childId);
	select GROUP_CONCAT(id) INTO childId FROM test WHERE FIND_IN_SET(parentid,childId)>0;
	END WHILE;

	RETURN ids;
END

2.2、使用

select getChildId(122)

二、根据子id查询父id

SELECT t2.* FROM ( 
    SELECT @r AS _id,  (SELECT @r := parentid FROM test WHERE id = _id) AS parentid, @l := @l + 1 AS lvl 
    FROM (
			SELECT @r := '要查询的ID', @l := 0) vars, test
    WHERE @r <> 0
) t1 JOIN test t2 ON t1._id = t2.id 
ORDER BY t1.lvl DESC

需修改的变量: id:主键、parentid:父id、test:表名。

 

欢迎关注

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值