0

階層グループリスト用にMySQLにクロージャーテーブルシステムを実装しました。

グループは、列IDと名前を持つテーブルcompany_groupsにあります。クロージャーテーブルはcompany_groups_treepathsです。

CREATE TABLE `company_groups` (
  `id` char(36) NOT NULL default '',
  `name` varchar(150) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `company_groups_treepaths` (
  `ParentID` char(36) NOT NULL default '',
  `ChildID` char(36) NOT NULL default '',
  `PathLength` int(11) NOT NULL default '0',
  PRIMARY KEY  (`ParentID`,`ChildID`),
  KEY `PathLength` (`PathLength`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

そして、私はそれからツリー構造を取得しようとしています。問題は、私が見つけた解決策のほとんどが、INTとauto_incrementであると仮定して、グループIDでgroup_concatを使用していることです。

ただし、GUIDを使用しているため、難しくなっています。ここで他の例を調べましたが、実際にはコツをつかむことができません。

たとえば、このクエリは正しいグループを取得しますが、ツリーは間違っています。

SELECT SQL_CALC_FOUND_ROWS p.`ChildID`, p.ParentID, d.name, CONCAT(REPEAT('-', p.`PathLength`), d.`name`) as path, p.`PathLength` as depth
        FROM 
            `company_groups` AS d
        JOIN `company_groups_treepaths` AS p ON d.`id` = p.`ChildID`
        JOIN `company_groups_treepaths` AS crumbs ON crumbs.`ChildID` = p.`ChildID`

        WHERE 
            p.`ParentID` = 'aa420c70-7050-11e2-b75d-672efc30777e'
          GROUP BY d.id

ORDER BY GROUP_CONCAT(crumbs.`PathLength`)

SQLフィドルはこちら:http ://sqlfiddle.com/#!2 / 474d4 / 2

そのクエリの正しい順序は次のようになります(Swedbankのすべての子をフェッチします)。

Swedbank(aa420c70-7050-11e2-b75d-672efc30777e)

  • hejsan(44b2b680-7f44-11e2-b04d-918fe8c8d065)
  • エステルイェータランド(aa420970-7050-11e2-893a-7f63b55a76db)
    • リージョナル1(a6adc800-7050-11e2-9db0-ad8ff41db08c)
      • asd(56fd15a0-7f44-11e2-b10f-55240ef76c28)
      • hejsan3(fc14c320-7f44-11e2-a2bb-ed51f02fd80f)
    • österの下(bb6b93a0-80ea-11e2-be1d-fd97d33aad97)
  • スモーランド(ae5dc150-7050-11e2-9b11-c96b3591816c)
    • asdasd(534e3f00-80df-11e2-b92e-fd29e414f3fd)
    • asd(6e640160-80de-11e2-8c41-d135d36c28db)
  • hejsan2(d95a7060-80be-11e2-8179-0b9231964800)

GUIDを使用してツリーを一覧表示するための良いアイデアはありますか?

関数自体はあまり頻繁に呼び出されないので、問題を解決する必要がある場合は、サブクエリの提案もかなり受け付けています。

4

1 に答える 1

0

http://karwin.blogspot.se/2010/03/rendering-trees-with-closure-tables.htmlにある概要に従って、基本を試すことに戻りました。

これは、最終的に機能したクエリです。

select group_concat(n.name order by a.PathLength desc separator ' -> ') as fullpath, CONCAT(REPEAT('-', d.`PathLength`), cg.`name`) as path, d.ChildID as group_id, d.PathLength as depth, cg.name
            from company_groups_treepaths d
            join company_groups_treepaths a on (a.ChildID = d.ChildID)
            join company_groups n on (n.id = a.ParentId)
            join company_groups cg on (cg.id = d.ChildID)

            where d.ParentID = 'aa420c70-7050-11e2-b75d-672efc30777e' and cg.deleted = 0 
            group by d.ChildID
            order by fullpath
于 2013-03-04T09:01:48.630 に答える