MySQL 子集查向上的父级,父级查询向下的所有子集

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.

目录

概括

表结构如下

通过父级ID查询子集的业务SQL

通过子集ID查询父级的ID信息


概括

       在实际使用中,通过父级ID查询下面所有子集的业务需求,同时也会有通过子集ID查询上级父级的ID信息。

表结构如下

以部门结构表为例

CREATE TABLE m_sys_dept (
  dept_id int NOT NULL AUTO_INCREMENT COMMENT '主键id',
  name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT  NULL COMMENT '部门名称',
  parent_id bigint DEFAULT '0' COMMENT '父id',
  sort int NOT NULL DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (dept_id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='部门管理';

通过父级ID查询子集的业务SQL

SELECT a.* FROM (SELECT * FROM m_sys_dept WHERE del_flag = 0) a , 
             (SELECT @pcode := 42384) b  
             WHERE FIND_IN_SET(parent_id, @pcode) > 0 
             AND @pcode := concat(@pcode, ',', dept_id)  
            union select * from m_sys_dept where dept_id = 42384 ;

42384 是要填入的节点ID; 

--- 这个是 :此方式在 dept_id 和 parent_id 都是顺序添加的情况下是OK的,即 parent_id < dept_id ,否则就会失效;

--------------------------------------------------升级方式----------------------------------------------------------

WITH RECURSIVE m_sys_dept_tree AS
(
  SELECT dept_id,`name`,parent_id,sort,1 AS level
  FROM m_sys_dept t
  WHERE dept_id = 42289 
  UNION ALL
  SELECT a.dept_id,a.`name`,a.parent_id,a.sort,b.level + 1 AS level
  FROM m_sys_dept a
  JOIN m_sys_dept_tree b ON b.dept_id=a.parent_id
)
SELECT * FROM m_sys_dept_tree ; ---- 包含父级自己信息

where level  !=1 ; ---- 不包含父级信息自己
执行此SQL,就可以获取到子集的信息;

通过子集ID查询父级的ID信息

WITH RECURSIVE parent_nodes AS (
  SELECT * FROM m_sys_dept WHERE dept_id = 731466 -- 子节点的id
  UNION ALL
  SELECT n.* FROM m_sys_dept n
  JOIN parent_nodes p ON p.parent_id = n.dept_id
)
SELECT * FROM parent_nodes;

731466 是子节点的ID

根据需求,手动变动SQL,就可以达到自己想要的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值