`

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

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

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 ;

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

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

相关推荐

Global site tag (gtag.js) - Google Analytics