Mysql8.0 WITH RECURSIVE递归的使用 查询某个部门是否是另外一个部门的子部门 / 给一个PID 查出所有符合的子项

数据库存在自关联的表结构中,比如说
        部门表, 部门之间的级联关系是通过部门ID和 部门PID维护的.
        职工表, 职工之间的上下级是通过职工ID和 职工PID维护的

以部门为例, 如果我们想查询某个部门是否是另外一个部门的子部门该怎么查? 
简单思考下, 这个问题好像需要递归处理, 因为子部门可能在这个部门的二级,三级或者更多级, 那么我们需要
        1.先查到部门的ID,
        2.然后根据ID在匹配PID,去查出子的ID
        3.继续根据子ID去查询孙ID.... 直到查不出来东西为止.

这个逻辑应用程序很容易实现, 单条SQL好像无法实现. 后面查询到了MYSQL8.0开始支持的递归算法如下:

WITH RECURSIVE childSql AS (
  SELECT id, name, pid from dept
  WHERE pid = 521
  UNION ALL
  SELECT d.id, d.name, d.pid FROM dept d
  JOIN childSql  ON d.pid = childSql.id
)
SELECT * FROM childSql;

-- 给一个PID 查出所有符合的子项

WITH RECURSIVE ret AS ( 
              SELECT id, dict_name,dict_code, parent_id, sorted FROM business_dict
              WHERE parent_id = 3 and enabled is true and displayed is true
              UNION ALL
              SELECT d.id, d.dict_name, d.dict_code, d.parent_id, d.sorted FROM business_dict d
              JOIN ret ON d.parent_id = ret.id where d.enabled is true and d.displayed is true
            ) 
           SELECT * FROM ret order by sorted

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值