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

階層カテゴリツリーでノードとそのアンカーのすべての兄弟を見つけるにはどうすればよいですか?

    私がそれをすべてフォローしているのかどうかはわかりませんが、カテゴリ5のすべての直接の子供が必要なようです。

    これを行う方法は次のとおりです。

    SELECT child.*
    FROM Category parent
      JOIN Category child 
        ON (child.lft BETWEEN parent.lft AND parent.rgt)
      LEFT JOIN Category intermediate 
        ON (intermediate.lft > parent.lft AND intermediate.rgt < parent.rgt
          AND child.lft > intermediate.lft AND child.rgt < intermediate.rgt)
    WHERE intermediate.CategoryId IS NULL
      AND parent.CategoryId = ?;
    

    編集: さて、私は今、上記の解決策はあなたが望むものの一部にすぎないことを理解しています。必要なもの:

    • CDプレーヤーの直接の祖先
    • CDプレーヤーの「おじさん」(祖先の兄弟)
    • CDプレーヤーの兄弟
    • CDプレーヤーの子供

    数分間作業させてください。

    これが私が思いついたものです:

    SELECT descendant.*,
      (current.lft BETWEEN descendant.lft AND descendant.rgt) AS is_selected,
      COUNT(DISTINCT c.CategoryId) AS depth
    FROM Category current
    JOIN Category selected 
      ON (current.lft BETWEEN selected.lft AND selected.rgt)
    JOIN Category descendant 
      ON (descendant.lft BETWEEN selected.lft AND selected.rgt)
    LEFT JOIN Category intermediate 
      ON (intermediate.lft > selected.lft AND intermediate.rgt < selected.rgt
        AND descendant.lft > intermediate.lft AND descendant.lft < intermediate.rgt)
    JOIN Category c
      ON (descendant.lft BETWEEN c.lft AND c.rgt)
    WHERE intermediate.CategoryId IS NULL
      AND current.CategoryId = ?
    GROUP BY descendant.CategoryId
    ORDER BY depth, descendant.name;
    
    • current CDプレーヤーです
    • selected CDプレーヤー(電子機器、携帯用電子機器、CDプレーヤー)の祖先です
    • descendantselectedの子または孫などです 祖先
    • intermediateselectedの子孫です descendantの親でもある祖先 -これらのいずれも存在してはならないため、IS NULL 制限。
    • c descendantからの祖先のチェーンです 深さを決定するために、一番上に戻ります。

    私のソリューションはcurrentのすべての子孫も返すことに気づきました ノード。したがって、現在「ポータブルエレクトロニクス」を表示している場合、クエリはその子を返しますが、孫の「フラッシュ」も返しますが、これは希望どおりではない可能性があります。



    1. SQL-多くの条件ですべての列の間に多くの単語を出力します

    2. SQLテーブルの初心者向けガイド

    3. mysqlデータベーステーブルの行をpandasDataFrameで置き換えます

    4. リクエストはHTTPステータス401で失敗しました:Unauthorized IN SSRS