MySQL 循环查询树 函数

注释齐全,可以用来学习存储函数的条件和循环、SQL条件

数据例子

# 创建测试表
CREATE TABLE `job_depend` (
  `sn_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '行号',
  `job_id` varchar(20) DEFAULT NULL COMMENT '作业ID',
  `depend_job_id` varchar(20) DEFAULT NULL COMMENT '依赖作业',
  PRIMARY KEY (`sn_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='作业依赖';

# 插入测试数据
INSERT INTO test.job_depend (job_id, depend_job_id) VALUES ('b', 'a');
INSERT INTO test.job_depend (job_id, depend_job_id) VALUES ('c', 'b');
INSERT INTO test.job_depend (job_id, depend_job_id) VALUES ('c', 's');
INSERT INTO test.job_depend (job_id, depend_job_id) VALUES ('s', 'c');

# 若函数存在则删除
DROP FUNCTION IF EXISTS getChild;
# 创建一个函数
CREATE FUNCTION getChild(jobId VARCHAR(21845))
  # 返回值类型
  RETURNS VARCHAR(21845)
  # 开始函数内容
  BEGIN
    # 定义一个变量存储合并后的字符串(逗号分隔)
    DECLARE childs VARCHAR(21845);
    # 定义一个变量存储当前查到的字符串(逗号分隔)
    DECLARE ids VARCHAR(21845);
    # 初始化字符串
    SET childs = '';
    SET ids = jobId;

    # 当前查到的字符串不为空时
    WHILE ids IS NOT NULL DO
      # 拼接字符串
      SET childs = concat(childs, ',', ids);

      # SELECT 不重复 拼接字段,默认逗号分隔
      # INTO 放入 当前查找的字符串
      # WHERE (查找值, 字符串集合) 且没有在合并字符串
      SELECT DISTINCT group_concat(depend_job_id)
      INTO ids
      FROM job_depend
      WHERE find_in_set(job_id, ids) > 0
            AND NOT find_in_set(depend_job_id, childs);
    END WHILE;

    # 返回合并后的字符串
    RETURN childs;
  END;

# 使用例子
SELECT *
FROM job_depend
WHERE find_in_set(job_id, getChild('c'));

# 查询本函数
SELECT
  SPECIFIC_NAME,
  ROUTINE_TYPE
FROM information_schema.ROUTINES
WHERE SPECIFIC_NAME = 'getChild';

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

mysql 多表关联查询 实现 全文匹配的 模糊搜索接口 SQLmysql 多表关联查询 实现 全文匹配的 模糊搜索接口 SQL

在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更...

1132
来自专栏C# 编程

1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表

约束条件分为以下几种: 1)非空约束,使用NOT NULL关键字; 2)默认值约束,使用DEFAULT关键字; 3)检查约束,使用CHECK关键字; 4)唯一约...

1960
来自专栏java达人

有哪些常用的sql语句

首行当然是最基本的增删查改啦,其中最重要的是查。 还有就是一些要注意的地方,就是SQL语句对大小写不敏感,语句中列名对应的值要用单引号''括起来不是双引号。...

18610
来自专栏Java 源码分析

数据库Exists关键字举例

一.问题描述: 查询所有未选择03号课程的学生的姓名 规定使用存在量词 student表: ? grade表: ? 二.思路: 既然是存在量词那么也就是E...

2896
来自专栏我的小碗汤

mysql支持原生json使用说明

MySQL在5.7.8开始对json原生支持,本文将对MySQL中json类型的用法简单说明,希望对你有用。

6316
来自专栏性能与架构

mysql 索引无效的情况

下面几种情况下,索引是不会被使用的 (1)组合索引,查询时的条件列不是组合索引中的第一个列 例如 组合索引 (a,b),查询中使用了b作为查询条件,这时是不会用...

3697
来自专栏C# 编程

2 - SQL Server 2008 之 使用SQL语句为现有表添加约束条件

上一节讲的是直接在创建表的时候添加条件约束,但是有时候是在表格创建完毕之后,再添加条件约束的,那么这个又该如何实现? 其实,跟上一节所写的SQL代码,很多是相同...

2140
来自专栏运维技术迷

MySQL数据库(八):表记录的基本操作(增删改查)

一、增 insert:增加(条件一条新纪录,默认新添加的记录都添加在已有记录的末尾) 1.格式: 1.1添加新纪录时,只给记录中的某几个字段赋值 inser...

56711
来自专栏pangguoming

SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写

一、实例介绍 SQL语句大小写到底是否区分呢?我们先从下面的这个例子来看一下: 例: --> 创建表,插入数据: declare @maco table (nu...

3927
来自专栏性能与架构

Mysql group by实现方式(一) - 索引扫描

由于GROUP BY实际上也同样须要进行排序操作,而且与ORDER BY相比,GROUP BY主要只是多了排序之后的分组操作。所以,在GROUP BY的实现过程...

2925

扫码关注云+社区