How to find all IDs of children recursively?

后端 未结 6 598
死守一世寂寞
死守一世寂寞 2020-12-05 07:58

I would like to get all IDs from children in a tree with MySQL only.

I have a table like this:

ID parent_id name
1  0         cat1
2  1         subca         


        
6条回答
  •  渐次进展
    2020-12-05 08:57

    create table it should be look like below

    DROP TABLE IF EXISTS `parent_child`;
    CREATE TABLE `parent_child` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `parent_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
    
    insert  into `parent_child`(`id`,`name`,`parent_id`)
    values (1,'cat1',0),(2,'subcat1',1),
    (3,'sub-subcat1',2),(4,'sub-subcat2',2),
    (5,'cat2',0);
    

    Create function for getting parent child element

    DELIMITER $$
    
    USE `yourdatabase`$$
    
    DROP FUNCTION IF EXISTS `GetAllNode1`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `GetAllNode1`(GivenID INT) RETURNS TEXT CHARSET latin1
        DETERMINISTIC
    BEGIN
        DECLARE rv,q,queue,queue_children TEXT;
        DECLARE queue_length,front_id,pos INT;
        SET rv = '';
        SET queue = GivenID;
        SET queue_length = 1;
        WHILE queue_length > 0 DO
            SET front_id = queue;
            IF queue_length = 1 THEN
                SET queue = '';
            ELSE
                SET pos = LOCATE(',',queue) + 1;
                SET q = SUBSTR(queue,pos);
                SET queue = q;
            END IF;
            SET queue_length = queue_length - 1;
            SELECT IFNULL(qc,'') INTO queue_children
            FROM (SELECT GROUP_CONCAT(id) AS qc
            FROM `parent_child` WHERE `parent_id` = front_id) A ;
            IF LENGTH(queue_children) = 0 THEN
                IF LENGTH(queue) = 0 THEN
                    SET queue_length = 0;
                END IF;
            ELSE
                IF LENGTH(rv) = 0 THEN
                    SET rv = queue_children;
                ELSE
                    SET rv = CONCAT(rv,',',queue_children);
                END IF;
                IF LENGTH(queue) = 0 THEN
                    SET queue = queue_children;
                ELSE
                    SET queue = CONCAT(queue,',',queue_children);
                END IF;
                SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1;
            END IF;
        END WHILE;
        RETURN rv;
    END$$
    
    DELIMITER ;
    

    write query for desire output

    SELECT GetAllNode1(id) FROM parent_child 
    or 
    SELECT GetAllNode1(id) FROM parent_child  where id =1 //for specific parent's child element 
    

提交回复
热议问题