设为首页 加入收藏

TOP

MySQL递归查询_函数语法检查_GROUP_CONCAT组合结果集的使用
2018-10-23 00:06:05 】 浏览:26
Tags:MySQL 查询 函数 语法 检查 _GROUP_CONCAT 组合 结果 使用

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


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;



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MongoDB集群架构之分片架构 下一篇MySQL数据库监控软件lepus使用问..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目