關於mysql 迭代


關於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'))


分享到:


相關文章: