sql >> データベース >  >> RDS >> Mysql

MySQLで階層データを取得する

    このリンクから答えを見つけました

    テーブルの作成:

    DROP TABLE IF EXISTS pctable;
    CREATE TABLE pctable
    (
        id INT NOT NULL AUTO_INCREMENT,
        parent_id INT,
        PRIMARY KEY (id)
    ) ENGINE=MyISAM;
    

    クエリの挿入:

    INSERT INTO pctable (parent_id) VALUES (0);
    INSERT INTO pctable (parent_id) SELECT parent_id+1 FROM pctable;
    INSERT INTO pctable (parent_id) SELECT parent_id+2 FROM pctable;
    INSERT INTO pctable (parent_id) SELECT parent_id+3 FROM pctable;
    INSERT INTO pctable (parent_id) SELECT parent_id+4 FROM pctable;
    INSERT INTO pctable (parent_id) SELECT parent_id+5 FROM pctable;
    SELECT * FROM pctable;
    

    関数の作成:

    DELIMITER $$
    
    DROP FUNCTION IF EXISTS `GetFamilyTree1` $$
    CREATE FUNCTION `GetFamilyTree1` (GivenID INT) RETURNS varchar(1024) CHARSET latin1
    DETERMINISTIC
    BEGIN
    
        DECLARE rv,q,queue,queue_children VARCHAR(1024);
        DECLARE queue_length,front_id,pos INT;
    
        SET rv = '';
        SET queue = GivenID;
        SET queue_length = 1;
    
        WHILE queue_length > 0 DO
            SET front_id = FORMAT(queue,0);
            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) qc
            FROM pctable 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 ;
    

    NOW FIRE SELECT QUERY:

    SELECT id,GetFamilyTree1(id) FROM pctable where id = 2;
    

    ****上記のクエリはID2の子を提供します。****

    2日後に私は解決策を得ました..:-)



    1. PostgreSQLに最適なDBaaSソリューション

    2. MySQLデータベース内のすべてのテーブルを一覧表示する4つの方法

    3. MySQLデータベースに保存されている画像を表示するにはどうすればよいですか?

    4. MySQLでストリームエラーの過去の終わりを読み込もうとしました