1

入れ子集合モデルのハイブリッドを使用して、子が複数の親を持つことができるようにします。これは、Mike Hillyersブログ(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ )で説明されている入れ子集合モデルの拡張です。これは、列名の一部を説明するのに役立つ場合があります。

私はSQLにかなり慣れていませんが、結合やサブクエリなどを調査しましたが、必要な結果が得られないようです。答えはかなり単純だと思いますが、ほぼ間違いなくそうなるでしょうがLEFT JOIN、私はそれに指を置くことができません。

「nested_pa​​rts」という5つの列を持つ単純なテーブルがあります:「tree_id」、「part_id」、「lft」、「rgt」、および「mapping」。

次のクエリは、2番目のクエリで比較したい値を返します。

SELECT * FROM nested_parts WHERE part_id = 125

具体的には、part#125が存在するtree_idと、各tree_idのlft値とrgt値がわかりました。

ここで、前にプルしたtree_id結果の配列にあるすべてのpart_idを知る必要があります。

私はこれにサブクエリを使用しました:

SELECT * FROM nested_parts
WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125)

次に、各tree_idのスコープ内でpart#125のlft値とrgt値の間にないlft値とrgt値を持つpart_idを知る必要があります。まだ比較するテーブルが2つある場合、または仮想テーブルを使用できる場合、これは簡単ですが、ループがないとここでは不可能に見えます。

どんな助けもありがたく受けましたが、私は怠惰ではなく愚かであり、UNIONS、JOINS、HAVING、WHERE、SELECT(SELECT)について多くのことを読みましたが、データの複雑さを上にして、これは非常に混乱しています。

敬具、

ジェームズ

4

1 に答える 1

1

データアーキテクチャを再検討することをお勧めしますが、この特定の問題を解決できるように支援します。

まず、をもう一度見てみましょうJOIN。あなたの質問

SELECT * FROM nested_parts WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125)

で簡略化することができますJOIN

SELECT np.* FROM nested_parts AS np
INNER JOIN nested_parts AS np2
ON np.tree_id = np2.tree_id
AND np2.part_id = 125

質問を読み終えて完全に理解した後、もう少し完全に答えます。これが今のところ役立つことを願っています。

アップデート:

lft値とrgt値がパート#125のlft値とrgt値の間にないレコードのみを取得するには、条件を使用する必要あります。HAVING

SELECT np.* FROM nested_parts AS np
INNER JOIN nested_parts AS np2
ON np.tree_id = np2.tree_id
AND np2.part_id = 125
HAVING np.lft > np2.rgt
    AND np.rgt < np2.lft

ここで私の論理が悪い場合は、私に知らせてください。しかし、これはあなたが探しているものだと思います。

編集:

クエリは、結合の条件を組み合わせることもできます

SELECT np.* FROM nested_parts AS np
INNER JOIN nested_parts AS np2
ON np.tree_id = np2.tree_id
AND np2.part_id = 125
AND np.lft > np2.rgt
AND np.rgt < np2.lft
于 2012-07-31T14:15:08.597 に答える