前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用

MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用

作者头像
星哥玩云
发布2022-08-17 16:17:35
2.5K0
发布2022-08-17 16:17:35
举报
文章被收录于专栏:开源部署

1-前言:

在MySL使用递归查询是很不方便的,不像SQL Server可以直接使用声明变量,使用虚拟表等等。如:DECLARE,BEGIN ...  END   ,WHILE ,IF 等等。

MySQL可以通过创建函数,来使用上面的流程控制语句,Mysql对函数的语法检查也是很苛刻的,可以说很烦人,不熟悉的人估计会哭。。。

2-递归查询关键部分:

  a-我的表结构:

  b-我的递归脚本:

  用于查询:当前类目ID及所有的父级元素的ID使用逗号分割开的一个字符串:

  下面脚本里使用了组合结果集的一个函数:GROUP_CONCAT,使用该函数可以在查不到结果的时候继续给pid赋值,从而跳出循环,详细可参考文章下面的注意点。

SELECT ParentID INTO pid FROM product_leimu WHERE 1=2; -- 找不到数据的情况下, INTO 无法给pid赋值,pid结果不变,

SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE 1=2; -- 找不到数据的情况下,通过函数GROUP_CONCAT组合之后,可以继续使用INTO 给pid赋值,pid结果为NULL

DROP FUNCTION IF EXISTS `fn_getLeimuPath`;

CREATE DEFINER = `sa`@`%` FUNCTION `fn_getLeimuPath`(`subId` int)  RETURNS varchar(1000) BEGINDECLARE pathID VARCHAR(4000) DEFAULT subId; DECLARE pid INT default subid;

WHILE pid>0 DO     SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE ID = pid;     IF pid>0 THEN        SET pathID = concat(pid, ',', pathID);     END IF; END WHILE;

RETURN pathID; END;

  查询结果展示:

3-一些需要注意的点,函数的一些特殊语法检查:

 a-脚本结束标记检查:  分号检查:

  如:每个独立的脚本语句;   流程控制语句结尾:END IF;  END;   END WHILE;

b-流程控制语句组合:

  如: 

IF 条件 THEN

    代码

ELSEIF

    代码

END IF;

WHILE 条件 DO

    代码

END WHILE;

c-特殊函数的使用:

  函数:GROUP_CONCAT:将结果集链接在一起,使用逗号分隔,group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

  备注: 这个函数可以在找不到数据的情况下,继续执行从而给INTO的变量赋值。   比较神奇:

代码语言:javascript
复制
SELECT ParentID INTO pid FROM product_leimu WHERE 1=2;     -- 找不到数据的情况下, INTO 无法给pid的结果不变,
代码语言:javascript
复制
SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE 1=2;   -- 找不到数据的情况下,通过函数GROUP_CONCAT组合之后,可以继续使用INTO 给pid赋值,NULL

  我们这里是想在查不到的结果的时候,通过WHILE的判断结束循环,如果不通过GROUP_CONCAT函数将结果传给pid,那么将会进入无线循环当中,是很坑的!! 下面脚本的代码结果是:2

DECLARE pid INT;

SELECT ParentID INTO pid FROM product_leimu WHERE 1=2;

IF pid IS NULL THEN     SET pid=1; END IF;

SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE 1=2;

IF pid IS NULL THEN     SET pid=2; END IF;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档