mysql中两列拼接_MySQL 如何实现递归查询?

本文介绍了在Oracle中如何使用start with connect by prior进行递归查询,以及在MySQL中由于缺乏内置递归查询功能,如何利用find_in_set、concat、concat_ws、group_concat函数以及自定义函数来实现递归查询。详细讲解了手动实现递归查询的方法,包括向下和向上递归的逻辑。
摘要由CSDN通过智能技术生成

点击上方 IT牧场 ,选择 置顶或者星标

技术干货每日送达!

04788f355f8727ee46dfde7c1ada9e45.png

前言

最近在做的业务场景涉及到了数据库的递归查询。我们公司用的 Oracle ,众所周知,Oracle 自带有递归查询的功能,所以实现起来特别简单。

但是,我记得 MySQL 是没有递归查询功能的,那 MySQL 中应该怎么实现呢?

于是,就有了这篇文章。

文章主要知识点:

  • Oracle 递归查询,  start with connect by prior 用法
  • find_in_set 函数
  • concat,concat_ws,group_concat 函数
  • MySQL 自定义函数
  • 手动实现 MySQL 递归查询

Oracle 递归查询

在 Oracle 中是通过 start with connect by prior 语法来实现递归查询的。

按照 prior 关键字在子节点端还是父节点端,以及是否包含当前查询的节点,共分为四种情况。

prior 在子节点端(向下递归)

第一种情况:start with 子节点id = ' 查询节点 ' connect by prior 子节点id = 父节点id

select * from dept start with id='1001' connet by prior id=pid;

这里,按照条件 id='1001' 对当前节点以及它的子节点递归查询。查询结果包含自己及所有子节点。

832b5508260ab2e0eb9b3542779cce90.png

第二种情况:start with 父节点id= ' 查询节点 '  connect by prior 子节点id = 父节点 id

select * from dept start with pid='1001' connect by prior id=pid;

这里,按照条件 pid='1001' 对当前节点的所有子节点递归查询。查询结果只包含它的所有子节点,不包含自己

2bb46e0ba797f25b2e7c552aadc42d75.png

其实想一想也对,因为开始条件是以父节点为根节点,且向下递归,自然不包含当前节点。

prior 在父节点端(向上递归)

第三种情况:start with 子节点id= ' 查询节点 ' connect by prior 父节点id = 子节点id

select * from dept start with id='1001' connect by prior pid=id;

这里按照条件 id='1001' ,对当前节点及其父节点递归查询。查询结果包括自己及其所有父节点。

734c07625fdd9230880c8ae72823b4f2.png

第四种情况:start with 父节点id= ' 查询节点 ' connect by prior 父节点id = 子节点id

select * from dept start with pid='1001' connect by prior pid=id;

这里按照条件 pid='1001',对当前节点的第一代子节点以及它的父节点递归查询。查询结果包括自己的第一代子节点以及所有父节点。(包括自己)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值