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

1-前言:sql

在Mysql使用递归查询是很不方便的,不像Sqlserver能够直接使用声明变量,使用虚拟表等等。如:DECLARE,BEGIN ...  END   ,WHILE ,IF 等等。函数

在Mysql能够经过建立函数,来使用上面的流程控制语句,Mysql对函数的语法检查也是很苛刻的,能够说很烦人,不熟悉的人估计会哭。。。spa

 

2-递归查询关键部分:code

  a-个人表结构:server

  

 

  b-个人递归脚本:blog

  用于查询:当前类目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结果为NULLget

   

DROP FUNCTION IF EXISTS `fn_getLeimuPath`; CREATE DEFINER = `sa`@`%` FUNCTION `fn_getLeimuPath`(`subId` int) RETURNS varchar(1000) BEGIN
DECLARE 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;
相关文章
相关标签/搜索