LTREE
あなたはほぼ正しい方向に進んでいます。階層データをデータベースに保存する「LTREE」システムに出くわしそうになりました。わずかな変更を加える必要があります。それだけです。
テーブルは次のようになります:
CREATE TABLE Table1
(`id` int, `parent_id` int, `name` varchar(13),
`path` char(10),
`money` int)
;
そして、あなたのデータはこのように見えるかもしれません。
(1, 0, 'company 1', '1', 10),
(2, 1, 'child 1', '1.1', 10),
(3, 2, 'child 2', '1.1.1', 10),
(4, 1, 'child 3', '1.2', 10,),
(4, 1, 'company 2', '2', 10),
(4, 1, 'child 2.1', '2.1', 10)
パス列は、どの会社が別の会社の子会社であるかを識別するのに役立ちます。実際にはallmoney
は必要ないことに注意してください。 桁。これは動的に生成されます。
そして、どのようにして最初の会社に属するすべてのお金を見つけますか?
select sum(money) from Table1 where path >= '1' and path < '2'
作成した構造では、child1がchild2の親であることに注意してください。では、どのようにしてchild1の全額を見つけるのでしょうか?
select sum(money) from Table1 where path >= '1.1' and path < '1.2'
クエリは1つだけで、再帰はありません。
MPTT
階層データをフェッチするためのもう1つの一般的なアプローチは、Modified Pre OrderTreeTraversalを使用することです。 Sitepoint に関する優れた記事があります。 何年もの間、これが多くのサンプルコードでどのように行われるかを説明しています。