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

ノードツリーから合計を取得する

    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 に関する優れた記事があります。 何年もの間、これが多くのサンプルコードでどのように行われるかを説明しています。



    1. CodeIgniterPHPでDBエラーをキャッチする方法

    2. MySqlCommandパラメータが機能しない

    3. パフォーマンスの驚きと仮定:STRING_SPLIT()

    4. MySQL SELECT ASは、2つの列を1つに結合します