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

子を選択するためのmySQLクエリ

    同じことをする必要があった以前のプロジェクトで行ったことは、2つの新しい列を追加したことです。

    • i_depth:カテゴリの深さの整数値
    • nvc_breadcrumb:パンくずタイプの形式のカテゴリの完全なパス

    次に、カテゴリ情報を格納するテーブルにトリガーを追加して、次のことを実行しました(3つの更新はすべて同じトリガーに含まれます)...

    -- Reset all branches
    UPDATE t_org_branches
        SET nvc_breadcrumb = NULL,
        i_depth = NULL
    
    -- Update the root branches first
    UPDATE t_org_branches 
        SET nvc_breadcrumb = '/', 
            i_depth = 0 
        WHERE guid_branch_parent_id IS NULL
    
    -- Update the child branches on a loop
    WHILE EXISTS (SELECT * FROM t_branches WHERE i_depth IS NULL) 
        UPDATE tobA 
            SET tobA.i_depth = tobB.i_depth + 1, 
                tobA.nvc_breadcrumb = tobB.nvc_breadcrumb + Ltrim(tobA.guid_branch_parent_id) + '/' 
            FROM t_org_branches AS tobA
                INNER JOIN t_org_branches AS tobB ON (tobA.guid_branch_parent_id = tobB.guid_branch_id) 
            WHERE tobB.i_depth >= 0 
                AND tobB.nvc_breadcrumb IS NOT NULL 
                AND tobA.i_depth IS NULL
    

    次に、カテゴリIDで商品テーブルと結合し、「LIKE'%/ [CATEGORYID] /%'」を実行します。これはMSSQLで行われたことを覚えておいてください。ただし、MySQLバージョンに変換するのは簡単なはずです。

    カットアンドペースト(テーブルと列の名前の変更後)に十分な互換性がある可能性があります。

    説明の拡大...

    t_categories(現在の状態)...

    Cat Parent  CategoryName
    1   NULL    MyStore
    2   1       Electronics
    3   1       Clothing
    4   1       Books
    5   2       Televisions
    6   2       Stereos
    7   5       Plasma
    8   5       LCD
    

    t_categories(変更後)...

    Cat  Parent  CategoryName   Depth   Breadcrumb
    1   NULL    MyStore         NULL    NULL    
    2   1       Electronics     NULL    NULL
    3   1       Clothing        NULL    NULL
    4   1       Books           NULL    NULL
    5   2       Televisions     NULL    NULL
    6   2       Stereos         NULL    NULL
    7   5       Plasma          NULL    NULL
    8   5       LCD             NULL    NULL
    

    t_categories(私が与えたスクリプトの使用後)

    Cat  Parent  CategoryName   Depth   Breadcrumb
    1   NULL    MyStore         0       /   
    2   1       Electronics     1       /1/
    3   1       Clothing        1       /1/
    4   1       Books           1       /1/
    5   2       Televisions     2       /1/2/
    6   2       Stereos         2       /1/2/
    7   5       LCD             3       /1/2/5/
    8   7       Samsung         4       /1/2/5/7/
    

    t_products(現在のように、変更はありません)...

    ID   Cat Name
    1   8   Samsung LNT5271F
    2   7   LCD TV mount, up to 36"
    3   7   LCD TV mount, up to 52"
    4   5   HDMI Cable, 6ft
    

    カテゴリと製品に参加する(カテゴリはC、製品はP)

    C.Cat Parent CategoryName   Depth   Breadcrumb  ID   p.Cat  Name
    1    NULL   MyStore         0       /           NULL NULL   NULL
    2    1      Electronics     1       /1/         NULL NULL   NULL
    3    1      Clothing        1       /1/         NULL NULL   NULL
    4    1      Books           1       /1/         NULL NULL   NULL
    5    2      Televisions     2       /1/2/       4    5      HDMI Cable, 6ft
    6    2      Stereos         2       /1/2/       NULL NULL   NULL
    7    5      LCD             3       /1/2/5/     2    7      LCD TV mount, up to 36"
    7    5      LCD             3       /1/2/5/     3    7      LCD TV mount, up to 52"
    8    7      Samsung         4       /1/2/5/7/   1    8      Samsung LNT5271F
    

    ここで、productsテーブルがより完全で、各カテゴリにものがあり、NULLがないと仮定すると、「Breadcrumb LIKE'%/ 5 /%'」を実行して、最後に提供したテーブルの最後の3つのアイテムを取得できます。カテゴリの直接アイテムと子(Samsungテレビなど)が含まれていることに注意してください。特定のカテゴリのアイテムのみが必要な場合は、「c.cat=5」を実行してください。



    1. データベースが空(テーブルなし)かどうかを確認するSQL

    2. Oracle PL/SQLコレクション-データベースにネストされた表を作成

    3. データベース内の文字列の組み合わせを使用したテーブルIDの自動インクリメント

    4. データベース接続は常に開いたままにする必要がありますか、それとも必要な場合にのみ開く必要がありますか?