階層グループリスト用に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を使用してツリーを一覧表示するための良いアイデアはありますか?
関数自体はあまり頻繁に呼び出されないので、問題を解決する必要がある場合は、サブクエリの提案もかなり受け付けています。