zoukankan      html  css  js  c++  java
  • MySQL向上递归,根据子节点查询父节点(根节点)的函数搭配改造的SQL语句的实现

    SBP_ORG_DEPT表结构如下:

    MySQL
    用函数 也可解决这种需求问题。

    group_concat 不适用数据较多的时候。

    函数getParentNodesFromChildNode如下所示(在MySQL数据库中新建函数):

    CREATE FUNCTION `getParentNodesFromChildNode`(rootId varchar(1024),sbp_org_dept varchar(256)) RETURNS varchar(1024) CHARSET utf8
    BEGIN
    DECLARE nParentList VARCHAR(10000);
    DECLARE nParentTemp VARCHAR(10000);

    SET nParentTemp = rootId;

    WHILE nParentTemp IS NOT NULL DO
    IF (nParentList IS NOT NULL) THEN
    SET nParentList = CONCAT(nParentTemp,',',nParentList);
    ELSE
    SET nParentList = CONCAT(nParentTemp);
    END IF;

    SELECT GROUP_CONCAT(parent_id) INTO nParentTemp FROM sbp_org_dept WHERE FIND_IN_SET(id,nParentTemp)>0;
    END WHILE;
    RETURN nParentList;
    END

    注:sbp_org_dept 是MySQL库中真实存在的表,parent_id和id是sbp_org_dept 表中真实存在的列!

    -- 后台调用:

    改造前的SQL语句):SELECT * from SBP_ORG_DEPT d start with id = #{deptId} connect by d.id = prior d.parent_id;

    改造后的SQL语句):SELECT *  from  SBP_ORG_DEPT where FIND_IN_SET( id , getParentNodesFromChildNode( #{deptId} , 'SBP_ORG_DEPT') );

    注:#{deptId},是后台映射传参进来的参数,参数名一定要一致!!!

     


     eg: select * from SBP_ORG_DEPT where FIND_IN_SET(id,getParentNodesFromChildNode('1788051', 'SBP_ORG_DEPT'));

    查询结果如下图所示:

     注:因为父节点id为0的数据为空(数据不完善的原因),所以根节点只递归到1787626!

  • 相关阅读:
    css 讲浮动,haslayout,BFC的文章
    css 给inline和inline-block元素设置margin和padding
    css inline元素和inline-block元素之间缝隙产生原因和解决办法
    js 匿名函数立即执行问题
    css 解决图片下小空隙问题
    css BFC布局及用处
    css 单行/多行文字垂直居中问题
    js柯里化
    js 回调函数理解与应用
    js 四种调用模式和this的关系总结
  • 原文地址:https://www.cnblogs.com/4AMLJW/p/MySQLFunctionSelectTreeParentNode202003171047.html
Copyright © 2011-2022 走看看