mysql 根据父查所有儿子,根据儿子查最上层的父

oracle可以使用connect by prior,进行父子查询,而mysql没有这种功能,需要自己写过程。
注意:pi_orgId 是条件值;pi_isQueryChild: 是查父还是查子,true 是查所有的儿子,false查最上层的父亲;pi_columNam是列明 ,pi_parentColumName 是父列名,pi_tableName 是表名。
[b]代码示例如下:[/b]

DELIMITER $$


USE `ivbs`$$


DROP PROCEDURE IF EXISTS `sp_recursive_query`$$


CREATE DEFINER=`root`@`%` PROCEDURE `sp_recursive_query`(IN pi_orgId VARCHAR(300),IN pi_isQueryChild BOOLEAN ,IN pi_columNam VARCHAR(50),IN pi_parentColumName VARCHAR(50) ,IN pi_tableName VARCHAR(50), OUT pi_out_str VARCHAR(1000))
BEGIN
DECLARE sTemp VARCHAR (4000) ;
SET sTemp = '$' ;
SET @sTempChd = CAST(pi_orgId AS CHAR) ;
WHILE
@sTempChd IS NOT NULL DO SET sTemp = CONCAT(sTemp, ',', @sTempChd ) ;
IF pi_isQueryChild THEN
-- 找儿子
SET @V_SQL := CONCAT('SELECT GROUP_CONCAT(',pi_columNam,') INTO @sTempChd FROM test_myt WHERE FIND_IN_SET(' , pi_parentColumName,',\'',@sTempChd,'\') > 0') ;
PREPARE stmt FROM @V_SQL;
EXECUTE stmt ;
DEALLOCATE PREPARE stmt;
ELSE
-- 找父亲
SET @V_SQL := CONCAT('SELECT GROUP_CONCAT(',pi_parentColumName,') INTO @sTempChd FROM test_myt WHERE FIND_IN_SET(' , pi_columNam,',\'',@sTempChd,'\') > 0');
PREPARE stmt FROM @V_SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END WHILE ;
SET pi_out_str=sTemp;
END$$


DELIMITER ;

[b]调用:[/b]
CALL sp_recursive_query('1',TRUE,'org_id','org_parent_id','table_name',@result);
SELECT @result;

结果:$,1,6,7,100,11,12 (通过1,找到所有的儿子,这是结果的格式,找父亲,第二个参数就传false,其他一样)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值