MySQL 列出相关依赖

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


结果展示
DROP TABLE IF EXISTS test.job_depend;
# 创建测试表
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');

# 设置连接函数最大长度(默认1024)
SET GLOBAL group_concat_max_len = 16777215;

# TINYTEXT 255 TEXT 65535 MEDIUMTEXT 16777215 LONGTEXT 4294967295
# 若存储过程存在则删除
DROP PROCEDURE IF EXISTS dep;
# 创建一个存储过程
CREATE PROCEDURE dep(jobId MEDIUMTEXT)
  # 开始内容
  BEGIN
    # 定义一个变量存储合并后的字符串(逗号分隔)
    DECLARE childs MEDIUMTEXT;
    # 定义一个变量存储当前查到的字符串(逗号分隔)
    DECLARE ids MEDIUMTEXT;
    # 初始化字符串
    SET childs = '';

    SET jobId = replace(jobId, '\n', '');
    SET jobId = replace(jobId, '\r', '');

    IF instr(jobId, ',') = 0
    THEN
      # 逗号分隔拼接字符串,支持查到多个
      # INTO 放入 JobId
      # 拼接 % 使自带 like 模糊查找
      SELECT DISTINCT group_concat(job_id)
          INTO jobId
      FROM job_depend
      WHERE job_id LIKE concat('%', jobId, '%');
    END IF;

    SET ids = jobId;

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

      # 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;

    SET ids = jobId;

    # 反过来查找依赖 ids 的
    WHILE ids IS NOT NULL DO
      SELECT DISTINCT group_concat(job_id)
      INTO ids
      FROM job_depend
      WHERE find_in_set(depend_job_id, ids) > 0
            AND NOT find_in_set(job_id, childs);
      IF ids IS NOT NULL THEN
        SET childs = concat(childs, ',', ids);
      END IF;
    END WHILE;

    SELECT
      # DISTINCT
      # 如果 job_id 是查询传入的 jobId
      # SQL 下的 IF 条件写法
      CASE find_in_set(job_id, jobId) > 0
      # 为真 则标记 =>
      WHEN TRUE THEN '=>'
      # 否则不显示任何内容
      ELSE '' END AS f,
      job_id,
      depend_job_id
    FROM job_depend
    WHERE find_in_set(job_id, childs)
    # 按下面依赖上面排序(需查找位置的子字符串, 大字符串)
    ORDER BY instr(job_id, jobId);
  END;

# 使用例子
CALL dep('c');

# 查询本程序
SELECT
  SPECIFIC_NAME,
  ROUTINE_TYPE
FROM information_schema.ROUTINES
WHERE SPECIFIC_NAME = 'dep';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 10,184评论 0 44
  • 自行创建一个员工信息表info,里面记录着员工姓名,年龄,地址以及工资,下面的实验要使用。 mysql> crea...
    张伟科阅读 1,496评论 0 2
  • 1、学习什么,想什么、做什么都是为了证明自己。至于证明什么自己也不清楚。 2、 把分工当分家。最终还是个干个的。 ...
    亚南YN阅读 260评论 1 1
  • 刚才在的等人的时候,翻了一下以前的截屏,有人说要紧跟时代,有人说要鉴定内心,有人说要适应趋势,有人说要找好自己的节...
    奶奶1202阅读 267评论 0 0
  • 出趟门挺累 今天养 上午弄弄花 中午小睡 睡醒想练 外面太冷 屋里练琴
    了了妈2017阅读 84评论 1 2

友情链接更多精彩内容