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

親子mysql

    編集

    Gordonsノートに対応する作業サンプル

    ツリーの最大深度が固定されているので、ノードパスを計算し、それに従って並べ替えます。

    SQLフィドル

    MySQL5.5.30スキーマのセットアップ

    create table mytable(id int, parent_id int, name varchar(100));
    
    insert mytable(id, parent_id, name)
    values (1, null, 'Home'),
    (2, null, 'Services'),
    (3, 2, 'Baking'),
    (4, 3, 'Cakes'),
    (5, 3, 'Bread'),
    (6, 5, 'Flat Bread'),
    (7, 1, 'Something');
    

    クエリ1

    select t0.*,
      concat(
          case coalesce(t4.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t4.Parent_ID as char), '\\')
          end,
          case coalesce(t3.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t3.Parent_ID as char), '\\')
          end,
          case coalesce(t2.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t2.Parent_ID as char), '\\')
          end,
          case coalesce(t1.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t1.Parent_ID as char), '\\')
          end,
          case coalesce(t0.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t0.Parent_ID as char), '\\')
          end,
          cast(t0.id as char)
        ) as path
    from mytable t0 
        left join mytable t1 on t0.Parent_ID = t1.Id
        left join mytable t2 on t1.Parent_ID = t2.Id
        left join mytable t3 on t2.Parent_ID = t3.Id
        left join mytable t4 on t3.Parent_ID = t4.Id
    order by 
      concat(
          case coalesce(t4.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t4.Parent_ID as char), '\\')
          end,
          case coalesce(t3.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t3.Parent_ID as char), '\\')
          end,
          case coalesce(t2.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t2.Parent_ID as char), '\\')
          end,
          case coalesce(t1.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t1.Parent_ID as char), '\\')
          end,
          case coalesce(t0.Parent_ID, 0) 
            when 0 then ''
            else concat(cast(t0.Parent_ID as char), '\\')
          end,
          cast(t0.id as char)
        )
    

    結果

    | ID | PARENT_ID |       NAME |    PATH |
    -----------------------------------------
    |  1 |    (null) |       Home |       1 |
    |  7 |         1 |  Something |     1\7 |
    |  2 |    (null) |   Services |       2 |
    |  3 |         2 |     Baking |     2\3 |
    |  4 |         3 |      Cakes |   2\3\4 |
    |  5 |         3 |      Bread |   2\3\5 |
    |  6 |         5 | Flat Bread | 2\3\5\6 |
    


    1. 実用的な例によるMySQLTRUNCATETABLEの理解

    2. djangoとmysqlがUTF-8で動作するように設定する方法

    3. クラスター化および非クラスター化インデックス:7つのトップポイントの説明

    4. MicrosoftAccessIDEに愛を与える時が来ました