内容简介:在MySL使用递归查询是很不方便的,不像SQL Server可以直接使用声明变量,使用虚拟表等等。如:DECLARE,BEGIN ... END ,WHILE ,IF 等等。在MySQL可以通过创建函数,来使用上面的流程控制语句,Mysql对函数的语法检查也是很苛刻的,可以说很烦人,不熟悉的人估计会哭。。。2-递归查询关键部分:
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的变量赋值。 比较神奇:
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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 入门:基础语法(五)函数
- PHP 7.4 新语法:箭头函数
- 悉数 Python 函数传参的语法糖
- 木兰语言 0.0.17.1:源码生成支持更多函数、类相关语法
- Python语法基础之初始化函数和类的继承
- 用Python做数据分析必知的语法和函数整理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX系统编程: 通信、并发与线程
【美】Kay Robbins、Steve Robbins / 师蓉 / 电子工业出版社 / 2018-5 / 198
《UNIX系统编程: 通信、并发与线程》是一本基于最新UNIX标准的完备的参考书,对UNIX编程的要点进行了清晰易懂的介绍,从一些用于说明如何使用系统调用的短小代码段开始,逐渐过渡到能帮助读者扩展自己技能水平的实际项目中。《UNIX系统编程: 通信、并发与线程》中对通信、并发和线程问题进行了深入探讨,对复杂的概念(如信号和并发)进行了全面且清晰的解释,还覆盖了与文件、信号、信号量、POSIX线程和......一起来看看 《UNIX系统编程: 通信、并发与线程》 这本书的介绍吧!