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

栏目: 数据库 · 发布时间: 6年前

内容简介:在MySL使用递归查询是很不方便的,不像SQL Server可以直接使用声明变量,使用虚拟表等等。如:DECLARE,BEGIN ...  END   ,WHILE ,IF 等等。在MySQL可以通过创建函数,来使用上面的流程控制语句,Mysql对函数的语法检查也是很苛刻的,可以说很烦人,不熟悉的人估计会哭。。。2-递归查询关键部分:

1-前言:

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

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

2-递归查询关键部分:

a-我的表结构:

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

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;

查询结果展示:

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

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的变量赋值。   比较神奇:

SELECT ParentID INTO pid FROM product_leimu WHERE 1=2;     -- 找不到数据的情况下, INTO 无法给pid的结果不变,
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;

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-10/154856.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

增长的本质

增长的本质

凯萨·伊达尔戈 / 中信出版集团股份有限公司 / 2015-11-1 / CNY 49.00

这是一本物理学家撰写得跨经济学、社会、物理学等多学科的专著。在伊达尔戈之前,从来没有人以这样的方式研究经济增长。 什么是经济增长?为什么它只发生在历史长河的一些节点上?传统意义上的解释都强调了体制、地理、金融和心理因素。而塞萨尔?伊达尔戈告诉我们,想了解经济增长的本质,还需要走出社会科学的研究,在信息、关系网和复杂性这样的自然科学中寻求答案。为了认识经济发展,塞萨尔?伊达尔戈认为我们首先需要......一起来看看 《增长的本质》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具