一次完成对多个子节点的全部父级节点查询

大家在做项目的时候,展示树形结构的数据,肯定遇到需要通过父节点递归查询所有子节点的情况,

也应该做过通过子节点查询所有父级节点的需求。

本次遇到的需求是一次性查询多个子节点的所有父级节点的情况。

多个节点我们考虑到要去除重复节点。

常规做法:

1. 数据库中写一个自定义函数,查询当前节点的所有父级节点

DROP FUNCTION if EXISTS fn_getParentNodes;
CREATE FUNCTION fn_getParentNodes(currentId VARCHAR(64))
RETURNS VARCHAR(1000)
BEGIN
    DECLARE parentId VARCHAR(100);
    DECLARE tempStr VARCHAR(1000) DEFAULT currentId;
    WHILE currentId is not null DO
      SET parentId = (SELECT pid FROM dept WHERE id = currentId );
        IF parentId is not null THEN
            set tempStr = CONCAT(parentId,‘,‘,tempStr);
            set currentId = parentId;
    ELSE
            set currentId = parentId;
        END IF;
    END WHILE;
RETURN tempStr;
END;
SELECT id,pid,name from dept where FIND_IN_SET(id, fn_getParentNodes(‘11‘))

2. 后台多次传递子节点调用当前子节点子查询所有父级节点。

3.单次调用到的结果存到List中。

4.多次调用的结果汇总,去重作为最终结果。

其实还有种最简单的做法:利用union查询,结果自动去重

SELECT id,pid,name from dept where FIND_IN_SET(id, fn_getParentNodes(‘11‘))
UNION
SELECT id,pid,name from dept where FIND_IN_SET(id, fn_getParentNodes(‘18‘))
ORDER BY pid

如果达到如上效果,一种在mysql执行动态sql,

还有一种是通过mybatis foreach标签实现:

Mapper中的方法

    /**
     * 查询多个部门的所有父级部门(递归,数据量大,肯定影响性能)
     * @param deptIds
     * @return
     */
    List<ZTreeNode> getParentZTeeNodeByDeptIds(@Param("deptIds") String[] deptIds);

Mapper.xml 配置

    <select id="getParentZTreeNodeByDeptIds" resultType="com.core.node.ZTreeNode">
        <foreach collection="deptIds" index="index" item="i"  separator="UNION" >
            SELECT
            id,pid,name
            FROM dept
            WHERE FIND_IN_SET(id, fn_getParentNodes(#{i}))
        </foreach>
        ORDER BY pid;
    </select>

这样能通过一次传递多个子节点参数 deptIds = 11,18,完成最终结果查询。

原文地址:https://www.cnblogs.com/liuxiutianxia/p/11240620.html

时间: 2024-08-26 19:15:29

一次完成对多个子节点的全部父级节点查询的相关文章

关于easyui Tree取得选中节点的父级节点(得到选取实心圆点的id)

官方的jquery.easyui.min.js已经实现了对实心圆点框id的获取,我们看官方如下代码: 如果我们让"_c0"的值变成"indeterminate"那么我们就能够得到想要的结果了,具体实现看如下代码:. var nodes = $('#tt').tree('getChecked','indeterminate'); 这样我们就能得到选中的实心圆点的id了 ,还有要得到选中的id,实现如下: function getChecked(){ var nodes

JS添加节点方法与JQuery添加节点方法的比较及总结

原生JS添加节点方法与JQuery添加节点方法的比较及总结 一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="div2">div2 <span id="span1">span1</span> <span id="span2">span2</span> <

原生JS添加节点方法与JQuery添加节点方法的比较及总结

一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="div2">div2 <span id="span1">span1</span> <span id="span2">span2</span> </div> <div id="div

怎样在当前节点的第一个子元素节点之前增加子元素节点或子文本节点

使用: ParentNode.prepend(); var parent = document.body; // 添加元素子节点 var p = document.createElement('p'); parent.prepend(p); // 添加文本子节点 parent.prepend('Hello'); // 添加多个元素子节点 var p1 = document.createElement('p'); var p2 = document.createElement('p'); pare

父兄子节点的获取及子节点的添加、删除、克隆操作

第一.父兄子节点的获取 1.父节点的获取 某节点的parentNode属性值即为该节点的父节点.示例: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <body> <div id="father"> <div id="son1"></div> </

JS获取节点的兄弟,父级,子级元素

先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 <div id="test"> <div></div> <div></div> </div> 原生的JS获取ID为test的元素下的子元素.可以用: var a = docuemnt.getElementById("

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素. <div id="test"> <div></div> <div></div> </div> 原生的J

二叉树中寻找共同节点的最低公共祖先节点

问题:在一棵二叉树中,给定两个节点,求这两个节点的最低的公共祖先节点,如下图中的,节点 6 和 节点 9 的最低公共祖先节点是节点 5. 最容易联想到的是,这个问题似乎与公共子串的问题有关系,如果我们能求出两个节点到根节点的路径,再使用匹配算法得到公共的路径,取这个路径上最后一个节点,即是所求的最低公共祖先节点. 哈夫曼编码启迪了我,我打算使用 0 表示向左走,1 表示向右走.如,101 表示自根节点,走到右孩子 A,再走到 A 的左孩子 B,再走到 B 的右孩子 C .于是,根节点到节点 C

JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)

利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对象 * 2.getElementsByName(): 通过标签中的name属性值来获取该标签对象集合 * 3.getElementsByTagName(): 通过标签名来获取该标签对象集合 现在来看看相对获取的方式: ※※二.相对获取(利用节点之间的层次关系),获取节点:-Node 1.父节点:pa