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

文章介绍了如何创建一个组织结构表,包括字段定义和数据插入。然后展示了使用SQL查询不同级别的组织,如所有三级组织、特定组织下的子组织等。还提到了在MyBatis中编写类似的查询语句的方式,并讨论了无前缀规律时的查询策略。
摘要由CSDN通过智能技术生成

创建简单的组织表

  • 字段1: 组织ID
  • 字段2:组织名称
  • 字段3:组织的父级ID
-- 创建组织结构表
CREATE TABLE organization (
    id VARCHAR(36) PRIMARY KEY,
    name VARCHAR(100),
    parent_id VARCHAR(36)
);

插入几条数据

INSERT INTO organization (id, name, parent_id)
VALUES
    ("00", '组织A', NULL),
    ("11", '组织B', NULL),
    ("0001", '子组织A1', "00"),
    ("0002", '子组织A2', "00"),
    ("1101", '子组织B1', "11"),
    ("1102", '子组织B2', "11"),
    ("000101", '子组织A1.1', "0001"),
    ("000102", '子组织A1.2', "0001"),
    ("000201", '子组织A2.1', "0002"),
    ("000202", '子组织A2.2', "0002"),
    ("110101", '子组织B1.1', "1101"),
    ("110102", '子组织B1.2', "1101"),
    ("110201", '子组织B2.1', "1102"),
    ("110202", '子组织B2.2', "1102");

查询组织

1、查询所有三级组织

  • sql
SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    parent.parent_id IS NULL
  • 输出结果
    在这里插入图片描述

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

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

  • sql
SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    parent.parent_id IS NULL  and child2.id like '00%';
  • 输出结果
    在这里插入图片描述

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

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

  • sql
SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    parent.parent_id IS NULL  and child2.id like '1101%';
  • 输出结果在这里插入图片描述

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

  • sql
SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    parent.parent_id IS NULL  and child2.id like '110101%';
  • 输出结果
    在这里插入图片描述

5、mybatis的写法

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

<where>
	<if test="id != null and id != ''">
		id like CONCAT(#{id}, '%')
	</if>
</where>

无前缀规律

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

SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    parent.id = "11"; -- 要查询的组织B的id

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

SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    child1.id = "1101"; -- 要查询的组织B1的id

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

SELECT 
    parent.id AS parent_id,
    parent.name AS parent_name,
    child1.id AS child1_id,
    child1.name AS child1_name,
    child2.id AS child2_id,
    child2.name AS child2_name
FROM 
    organization AS parent
JOIN 
    organization AS child1 ON parent.id = child1.parent_id
JOIN 
    organization AS child2 ON child1.id = child2.parent_id
WHERE 
    child2.id = "110101"; -- 要查询的组织B1.1的id

4、mybatis的xml的sql写法

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

<where>
	<if test="idOne != null and idOne != ''">
		parent.id = #{idOne}
	</if>
	<if test="idTwo != null and idTwo != ''">
		child1.id = #{idTwo}
	</if>
	<if test="idThree != null and idThree != ''">
		child2.id = #{idThree}
	</if>
</where>

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

结束!!!!!
hy:19


						人而不学,其犹正墙面而立。--《尚书》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值