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

ツリー表現の階層パスを見つける方法

    ネストは最大7レベルの深さになる可能性があるため、質問で述べたようにストアドプロシージャを使用できます。

    ストアドプロシージャ

    CREATE PROCEDURE updatePath()
    BEGIN
    declare cnt, n int;
        select count(*) into n from foo where parent_id is null;
        update foo a, foo b set a.path = b.name where b.parent_id is null and a.parent_id = b.id;
        select count(*) into cnt from foo where path is null;
        while cnt > n do
            update foo a, foo b set a.path = concat(b.path, '/', b.name) where b.path is not null and a.parent_id = b.id;
            select count(*) into cnt from foo where path is null;
        end while;
    END//
    

    実際のレコードを確認するために、パス列にnull値を持つプレーンレコードを出力しました

    select * from foo
    

    結果

    | ID |         NAME | PARENT_ID |   PATH |
    ------------------------------------------
    |  1 |        root1 |    (null) | (null) |
    |  2 |       child1 |         1 | (null) |
    |  3 |    subchild1 |         2 | (null) |
    |  4 |       child2 |         1 | (null) |
    |  5 |       child3 |         1 | (null) |
    |  6 |    subchild2 |         4 | (null) |
    |  7 | subsubchild1 |         6 | (null) |
    

    プロシージャの呼び出し

    call updatepath
    

    プロシージャ実行後の結果

    select * from foo
    

    結果

    | ID |         NAME | PARENT_ID |                   PATH |
    ----------------------------------------------------------
    |  1 |        root1 |    (null) |                 (null) |
    |  2 |       child1 |         1 |                  root1 |
    |  3 |    subchild1 |         2 |           root1/child1 |
    |  4 |       child2 |         1 |                  root1 |
    |  5 |       child3 |         1 |                  root1 |
    |  6 |    subchild2 |         4 |           root1/child2 |
    |  7 | subsubchild1 |         6 | root1/child2/subchild2 |
    

    SQLFIDDLE

    これがお役に立てば幸いです...



    1. Spring Data JPA + Hibernate Skip Locked rows(PostgreSQL)

    2. ActiveRecordを使用してmysqlでDISTINCTONを使用する方法

    3. データベースと認証ユーザーからソルトされたパスワードを撤回する方法は?

    4. データなしのMySqlエクスポートスキーマ