美文网首页程序员的日常记忆MySQL数据库
sql返回指定节点的树形结构数据

sql返回指定节点的树形结构数据

作者: 一名程序猿 | 来源:发表于2018-11-16 22:45 被阅读277次
    背景

    就是有这么一个需求,返回指定组织下的组织机构,以及所在该组织机构下的人。(用sql)
    简单描述就是如下:

    请叫我树形图
    使用sql,返回部门1以及其子部门数据
    很明显就是一个树形递归嘛,用代码就比较好实现。
    但是要用sql实现,就稍微麻烦点。
    正文

    创建符合上述思维导图的表department,如下图:

    请叫我数据表
    我就不按网上百度的sql树形递归的思路讲了。我也去百度了,感觉一大扒拉,又不想看。我又想按代码递归的思路写,总感觉有点不对。于是乎,就用了最正常,最直接的方式去完成这一任务。
    比如,我想知道部门1有哪些孩子,只需要parent_id等于部门1的id。想知道部门11有哪些孩子,只需要知道parent_id等于部门11的id。
    所以最后我采用的是循环的方式。
    sql存储过程如下
    DROP PROCEDURE
    IF EXISTS get_part_department;
    
    CREATE PROCEDURE get_part_department ()
    BEGIN
      SELECT
          group_concat(id) INTO @ids
      FROM
          department
      WHERE
          parent_id = '2';
    
    SELECT
      GROUP_CONCAT(id) INTO @temps
    FROM
      department
    WHERE
      find_in_set(parent_id, @ids);
    
    
    SET @alls = CONCAT_WS(',' ,@ids ,@temps);
    
    
    REPEAT
      SELECT
          GROUP_CONCAT(id) INTO @temps
      FROM
          department
      WHERE
          find_in_set(parent_id, @temps);
    
    
    SET @alls = CONCAT_WS(',' ,@alls ,@temps);
    
    UNTIL @temps IS NULL
    END
    REPEAT
    ;
    
    SELECT
      *
    FROM
      department
    WHERE
      FIND_IN_SET(id ,@alls)
    OR FIND_IN_SET(parent_id ,@alls)
    OR id = 2;
    
    
    END
    

    执行结果如下:


    返回指定节点以及其下子节点数据

    到此,本文需求功能已实现。

    知识点

    1.数据库是mysql,所用的函数也是mysql的函数。
    2.@ids会话变量的使用
    3.repeat.....until循环使用(与其他循环的方式区别)
    4.GROUP_CONCAT,CONCAT_WS拼接字符串的使用
    5.FIND_IN_SET函数的使用

    FIND_IN_SET函数

    FIND_IN_SET着重讲一哈,因为这也是我第一次使用。

    FIND_IN_SET(str,strlist)
    假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。一个字符串列表就是一个由一些被‘,'符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。

    结语

    不积跬步无以至千里。觉得不错,记得点亮小星星。

    相关文章

      网友评论

        本文标题:sql返回指定节点的树形结构数据

        本文链接:https://www.haomeiwen.com/subject/xupmfqtx.html