关于mysql 迭代

        在开发中经常遇到一些数据需要迭代才能查出,于是查了一下mysql如何实现对数据的的迭代,网上基本都是用函数实现的。但是都只是介绍写法,和实现效果。我们在实际情况中建立的表肯定是和网上给出不同的,这就让第一次接触函数的人一脸懵逼不知道该怎么弄,往往需要反复尝试才能成功。

        于是我记录了一下,我用到的一条迭代函数语句,我会注明几个修改点。这样就基本可以根据说明修改完成后直接用了。先让我们看一下函数语句。

        

DROP FUNCTION IF EXISTS `test`;
DELIMITER ;;
CREATE DEFINER=`db`@`%` FUNCTION `test`(testId CHAR(32)) RETURNS varchar(4000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(testId  AS CHAR(32));

WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(sort_id) INTO sTempChd FROM workorder_sort WHERE FIND_IN_SET(sort_pid,sTempChd)>0 ;
END WHILE;
RETURN sTemp;
END
;;
DELIMITER ;

   

DROP FUNCTION IF EXISTS `函数名称`;
DELIMITER ;;
CREATE DEFINER=`db`@`%` FUNCTION `函数名称`(条件字段 字段类型(字段长度)) RETURNS varchar(4000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(条件字段   AS CHAR(32));

WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(把特定字段整理成一个字符串) INTO sTempChd FROM 迭代表名 WHERE FIND_IN_SET(迭代字段,sTempChd)>0 ;
END WHILE;
RETURN sTemp;
END
;;
DELIMITER ;

   根据上面2个函数sql就可以对比出,我们需要干以下几件事:

   1. 修改自己需要的函数名

   2. 定义传入的字段名称,字段类型以及字段长度

   3. 对条件字段进行类型转换  ,并赋值给sTempChd 。(如果类型相同不要这个,直接 sTempChd = 条件字段即可

   4. 设置需要整理的id,这个是把查出的迭代id整理成一个字段串。(因为我们一般在查询语句会有很多条件,所以我们这里只是查出所有id,然后配合sql语句最终实现我们想要的效果。

   5. 修改表名

   6. 设置迭代的关联字段,一般为xxpid 。

   7. 执行改完的语句,自动生成函数。

   通过上面几步,我们一般就可以建立一个符合自己预期的函数。然后我们只需要写一个查询sql语句即可把,父类及下面的子类都查询出来:

  

SELECT * FROM workorder_sort WHERE FIND_IN_SET(sort_id,queryChildrenAreaInfo('111'))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章