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

 

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