Mysql之子父級查詢


 

函數遞歸方式

 

根據父id獲取所有子類ids(包含當前父id) 可以傳遞多個id 逗號分隔
set global log_bin_trust_function_creators=TRUE;
DROP FUNCTION IF EXISTS getProductCategoryChildIDs;
CREATE FUNCTION getProductCategoryChildIDs(categoryId varchar(100))  RETURNS varchar(1000) 
BEGIN
 
DECLARE sTemp VARCHAR (1000);
DECLARE sTempIds VARCHAR (1000);
SET sTemp = '$';
SET sTempIds = CAST(categoryId AS char(10));
 
 
WHILE sTempIds IS NOT NULL DO
 
SET sTemp = CONCAT(sTemp, ',', sTempIds);
SELECT GROUP_CONCAT(id) INTO sTempIds FROM t_product_category WHERE FIND_IN_SET(categoryId, sTempIds) > 0;
 
END WHILE;
 
RETURN sTemp;
 
END


#SELECT getProductCategoryChildIDs('1');
#SELECT getProductCategoryChildIDs('1,2');

 


根據子類id獲取所有父類ids (包含當前子類id)
CREATE FUNCTION getParentIDs(childId INT) RETURNS VARCHAR(1000) CHARSET utf8
BEGIN

DECLARE sTemp VARCHAR (1000);
DECLARE sTempIds VARCHAR (1000);
SET sTemp = '$';
SET sTempIds = CAST(childId AS CHAR(10));


WHILE sTempIds IS NOT NULL DO

SET sTemp = CONCAT(sTemp, ',', sTempIds);
SELECT GROUP_CONCAT(parent_id) INTO sTempIds FROM category WHERE FIND_IN_SET(id, sTempIds) > 0;

END WHILE;

RETURN sTemp;

END


#SELECT getParentIDs(10);

 

 

 

sql循環方式

 

假設表結構為id,name,parent_id

查詢id為5的所有父id

 

SELECT
    T2.id,
    T2.`name`
FROM
    (
        SELECT
            @r AS _id,
            (
                SELECT
                    @r := parent_id
                FROM
                    category
                WHERE
                    id = _id
            ) AS parent_id,
            @l := @l + 1 AS lvl
        FROM
            (SELECT @r := 5, @l := 0) vars,
            category h
        WHERE
            @r <> 0
    ) T1
JOIN category T2 ON T1._id = T2.id
ORDER BY
    T1.lvl DESC

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM