MySQL 遞歸查詢實踐總結

MySQL複雜查詢使用實例函數

By:授客 QQ1033553122ui

 

 

表結構設計

SELECT id, `name`, parent_id FROM `tb_testcase_suite`spa

 

 

 

 

說明:設計

parent_id值關聯表自身id列的值,若是其值爲-1,則表示該記錄不存在父級記錄,不然表示該記錄存在父級記錄(假設parent_id值爲5,則父級記錄id爲5),暫且把該記錄自身稱之爲子記錄,父級及父父級的記錄稱之爲祖先記錄,子級及子子級記錄稱之爲後輩記錄3d

 

查詢需求

1) 根據指定記錄的id,查詢該記錄關聯的全部祖先記錄,並按層級返回祖先記錄nameblog

2) 根據指定parent_id,查詢其關聯的的全部後輩記錄id遞歸

查詢實現

經過函數調用實現it

1)根據指定記錄的id,查詢該記錄關聯的全部祖先記錄,並按層級返回祖先記錄nametest

# 向下遞歸select

DROP FUNCTION IF EXISTS queryChildrenSuiteIds;

DELIMITER ;;

CREATE FUNCTION queryChildrenSuiteIds(suiteId INT)

RETURNS VARCHAR(4000)

BEGIN

DECLARE childSuiteIds VARCHAR(4000);

DECLARE parentSuiteIds VARCHAR(4000);

 

SET childSuiteIds='';

SET parentSuiteIds = CAST(suiteId AS CHAR);

 

WHILE parentSuiteIds IS NOT NULL DO

    SET childSuiteIds= CONCAT(parentSuiteIds, ',', childSuiteIds);

    SELECT GROUP_CONCAT(id) INTO parentSuiteIds FROM tb_testcase_suite WHERE FIND_IN_SET(parent_id, parentSuiteIds)>0;

END WHILE;

RETURN childSuiteIds;

END

;;

DELIMITER ;

 

 

# 調用

SELECT queryChildrenSuiteIds(5);

 

 

 

 

2)根據指定parent_id,查詢其關聯的的全部後輩記錄id

 

# 向上遞歸

DROP FUNCTION IF EXISTS querySuitePath;

DELIMITER ;;

CREATE FUNCTION querySuitePath(suiteId INT)

RETURNS VARCHAR(21845)

BEGIN

DECLARE suitePath VARCHAR(21845);

DECLARE parentId INT;

DECLARE suiteName VARCHAR(4000);

 

SET suitePath='';

SET suiteName = '';

SET parentId = NULL;

 

 

SELECT parent_id, `name` INTO parentId, suiteName FROM tb_testcase_suite WHERE id = suiteId;

WHILE parentId <>0 DO

    SET suitePath = CONCAT(suiteName, '/', suitePath);

   

    # 如下兩行代碼很關鍵 # 查詢結果爲空時,不會執行select ...into...這個賦值操做,致使parentId一直取最後一次查到的非0值,進而致使死循環   

    SET suiteId = parentId;

    SET parentId = 0;

   

    SELECT parent_id, `name` INTO parentId, suiteName FROM tb_testcase_suite WHERE id = suiteId;

END WHILE;

RETURN CONCAT('/', suitePath);

END

;;

DELIMITER ;

 

# 調用

SELECT querySuitePath(5);

 

 

SELECT id, querySuitePath(id), `name`, parent_id FROM `tb_testcase_suite`

 

相關文章
相關標籤/搜索