如何查询组织结构(组织结构树)

亦凉 2024-03-17 16:35 156阅读 0赞

创建简单的组织表

  • 字段1: 组织ID
  • 字段2:组织名称
  • 字段3:组织的父级ID

    — 创建组织结构表
    CREATE TABLE organization (

    1. id VARCHAR(36) PRIMARY KEY,
    2. name VARCHAR(100),
    3. parent_id VARCHAR(36)

    );

插入几条数据

  1. INSERT INTO organization (id, name, parent_id)
  2. VALUES
  3. ("00", '组织A', NULL),
  4. ("11", '组织B', NULL),
  5. ("0001", '子组织A1', "00"),
  6. ("0002", '子组织A2', "00"),
  7. ("1101", '子组织B1', "11"),
  8. ("1102", '子组织B2', "11"),
  9. ("000101", '子组织A1.1', "0001"),
  10. ("000102", '子组织A1.2', "0001"),
  11. ("000201", '子组织A2.1', "0002"),
  12. ("000202", '子组织A2.2', "0002"),
  13. ("110101", '子组织B1.1', "1101"),
  14. ("110102", '子组织B1.2', "1101"),
  15. ("110201", '子组织B2.1', "1102"),
  16. ("110202", '子组织B2.2', "1102");

查询组织

1、查询所有三级组织

  • sql

    SELECT

    1. parent.id AS parent_id,
    2. parent.name AS parent_name,
    3. child1.id AS child1_id,
    4. child1.name AS child1_name,
    5. child2.id AS child2_id,
    6. child2.name AS child2_name

    FROM

    1. organization AS parent

    JOIN

    1. organization AS child1 ON parent.id = child1.parent_id

    JOIN

    1. organization AS child2 ON child1.id = child2.parent_id

    WHERE

    1. parent.parent_id IS NULL
  • 输出结果
    在这里插入图片描述

2、查询A组织下的所有组织(查第一级下的所有组织)

因为这里的ID都是有规律,前缀可以识别,所以使用用like模糊查询,如果ID不能通过前缀来判别,则不能使用。

  • sql

    SELECT

    1. parent.id AS parent_id,
    2. parent.name AS parent_name,
    3. child1.id AS child1_id,
    4. child1.name AS child1_name,
    5. child2.id AS child2_id,
    6. child2.name AS child2_name

    FROM

    1. organization AS parent

    JOIN

    1. organization AS child1 ON parent.id = child1.parent_id

    JOIN

    1. organization AS child2 ON child1.id = child2.parent_id

    WHERE

    1. parent.parent_id IS NULL and child2.id like '00%';
  • 输出结果
    在这里插入图片描述

3、查询B1组织下的所有组织(查第二级下的所有组织)

还是使用前缀的特点模糊查询。

  • sql

    SELECT

    1. parent.id AS parent_id,
    2. parent.name AS parent_name,
    3. child1.id AS child1_id,
    4. child1.name AS child1_name,
    5. child2.id AS child2_id,
    6. child2.name AS child2_name

    FROM

    1. organization AS parent

    JOIN

    1. organization AS child1 ON parent.id = child1.parent_id

    JOIN

    1. organization AS child2 ON child1.id = child2.parent_id

    WHERE

    1. parent.parent_id IS NULL and child2.id like '1101%';
  • 输出结果在这里插入图片描述

4、查询B1.1组织(具体的第三级组织)

  • sql

    SELECT

    1. parent.id AS parent_id,
    2. parent.name AS parent_name,
    3. child1.id AS child1_id,
    4. child1.name AS child1_name,
    5. child2.id AS child2_id,
    6. child2.name AS child2_name

    FROM

    1. organization AS parent

    JOIN

    1. organization AS child1 ON parent.id = child1.parent_id

    JOIN

    1. organization AS child2 ON child1.id = child2.parent_id

    WHERE

    1. parent.parent_id IS NULL and child2.id like '110101%';
  • 输出结果
    在这里插入图片描述

5、mybatis的写法

使用mybatis的xml写sql时,只需要使用#{ID}进行参数替换,并拼接就行。

  1. <where>
  2. <if test="id != null and id != ''">
  3. id like CONCAT(#{id}, '%')
  4. </if>
  5. </where>

无前缀规律

1、查询B组织下的所有组织

  1. SELECT
  2. parent.id AS parent_id,
  3. parent.name AS parent_name,
  4. child1.id AS child1_id,
  5. child1.name AS child1_name,
  6. child2.id AS child2_id,
  7. child2.name AS child2_name
  8. FROM
  9. organization AS parent
  10. JOIN
  11. organization AS child1 ON parent.id = child1.parent_id
  12. JOIN
  13. organization AS child2 ON child1.id = child2.parent_id
  14. WHERE
  15. parent.id = "11"; -- 要查询的组织Bid

2、查询B1组织下的所有组织

  1. SELECT
  2. parent.id AS parent_id,
  3. parent.name AS parent_name,
  4. child1.id AS child1_id,
  5. child1.name AS child1_name,
  6. child2.id AS child2_id,
  7. child2.name AS child2_name
  8. FROM
  9. organization AS parent
  10. JOIN
  11. organization AS child1 ON parent.id = child1.parent_id
  12. JOIN
  13. organization AS child2 ON child1.id = child2.parent_id
  14. WHERE
  15. child1.id = "1101"; -- 要查询的组织B1id

3、查询第三级B1.1组织

  1. SELECT
  2. parent.id AS parent_id,
  3. parent.name AS parent_name,
  4. child1.id AS child1_id,
  5. child1.name AS child1_name,
  6. child2.id AS child2_id,
  7. child2.name AS child2_name
  8. FROM
  9. organization AS parent
  10. JOIN
  11. organization AS child1 ON parent.id = child1.parent_id
  12. JOIN
  13. organization AS child2 ON child1.id = child2.parent_id
  14. WHERE
  15. child2.id = "110101"; -- 要查询的组织B1.1id

4、mybatis的xml的sql写法

这里idOne是第一级ID,idTwo是第二级ID,idThree是第三级ID,并且只能传一个,这样传第一级时才能查出下面的所有组织。

  1. <where>
  2. <if test="idOne != null and idOne != ''">
  3. parent.id = #{idOne}
  4. </if>
  5. <if test="idTwo != null and idTwo != ''">
  6. child1.id = #{idTwo}
  7. </if>
  8. <if test="idThree != null and idThree != ''">
  9. child2.id = #{idThree}
  10. </if>
  11. </where>

这是我目前能想到的方法,大家都更好的解决方案,可以一起交流。

结束!!!!!
hy:19


  1. 人而不学,其犹正墙面而立。--《尚书》

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读

    相关 rust 模块组织结构

    rust有自己的规则和约定用来组织模块,比如一个包最多可以有一个库crate,任意多个二进制crate、导入文件夹内的模块的两种约定方式… 知道这些约定,就可以快速了解rust

    相关 rust 模块组织结构

    `rust`有自己的规则和约定用来组织模块,比如一个包最多可以有一个库`crate`,任意多个二进制`crate`、导入文件夹内的模块的两种约定方式... 知道这些约定,就可以

    相关 Activiti扩展组织结构

    让Activiti引擎挂接自身的组织架构 要实现流程中的与组织架构有关的整合,我们需要先了解一下目前在哪些业务需求上使用了组织架构的需求,在我们以往的大量实施国内的业务流