1

mysql の専門家の何人かが私を助けてくれることを願っています。

ネストされたセットに格納されている searchtag データがあります。

TABLE searchTags

searchTagID
searchTag
lft
rgt

(ツリーのブランチ全体を簡単に選択する必要がある場合があるため、ネストされたセットを使用しています。)

LIKE に一致するノードの結果セット、これらの各ノードの祖先、およびこれらの各ノードの直接の子を返すクエリを作成したいと考えています。

たとえば、これがネストされたセットの場合...

                          1_tagA_22
     2_tagB1_11          12_tagB2_13           14_tagB3_21
3_taC1_4   5_taC2_10                                   15_tagC3_20
               6_tagD1_9                        16_tagD2_17    18_tagD3_19
                  7_tagE1_8

...そして、私の検索針には LIKE CONCAT('%','tagc','%') があり、次のようなものを返したいと思います:

searchTag   |   ancestors   |  immediateChildren
tagC1          tagB1,tagA       NULL
tagC2         tagB1,tagA       tagD1
tagC3          tagB3,tagA       tagD2,tagD3

現在、複数のクエリでこれを行っています。最初に、検索タグとその祖先の結果セットを選択します。次に、この結果セットをループし、結果ごとに別の選択を行って直接の子を取得します。(参照用に、これらのクエリを以下に含めます。)

この方法は機能しますが、非効率的な解決策であり、遅かれ早かれ失敗する可能性が高いと感じています。:)これを行うためのより良い方法があるかどうか疑問に思っています-つまり、これらすべてをより効率的な単一のSELECTステートメントに結合する方法はありますか?

アドバイスをいただければ幸いです。

ありがとう!

参考:検索タグと祖先のパスを選択するには、次を使用します...

    SELECT 

        node.searchTag, 

        GROUP_CONCAT(parent.searchTag 
        ORDER BY parent.lft DESC
        SEPARATOR '; ') AS ancestors 


    FROM 

        searchTags AS node,
        searchTags AS parent

    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND parent.lft < node.lft
    AND node.searchTag LIKE CONCAT('%','tagc','%')
    GROUP BY node.searchTagID;

...そして、この結果セットをループし、結果ごとに別のクエリを実行して、直接の子を取得します (mrbinky3000 の優れた方法を使用):

SELECT lft, rgt INTO @parent_left, @parent_right FROM searchTags WHERE searchTagID = $id;

SELECT 

    GROUP_CONCAT(child.searchTag SEPARATOR "; ") as searchTag

FROM searchTags AS child
LEFT JOIN searchTags AS ancestor ON
    ancestor.lft BETWEEN @parent_left+1 AND @parent_right-1 AND
    child.lft BETWEEN ancestor.lft+1 AND ancestor.rgt-1
WHERE
    child.lft BETWEEN @parent_left+1 AND @parent_right-1 AND
    ancestor.searchTagID IS NULL;
4

2 に答える 2

1

これは、ソリューションを備えた SQL Fiddle です

SQL は次のとおりです。

SELECT t0.title node
      ,GROUP_CONCAT(t5.title) children
      ,(SELECT GROUP_CONCAT(t6.title)
                    FROM Tree t6
                    WHERE t6.lft<t0.lft AND t6.rgt>t0.rgt
                    ORDER BY t6.lft) ancestors
FROM Tree t0
     LEFT JOIN
     (SELECT *
      FROM (SELECT t1.lft node
                  ,MAX(t2.lft) nodeparent
            FROM Tree t1
                 INNER JOIN
                 Tree t2 ON t1.lft>t2.lft AND t1.rgt<t2.rgt
            GROUP BY t1.lft) t3 
            LEFT JOIN
            Tree t4 ON t3.node=t4.lft) t5 ON t0.lft=t5.nodeparent
GROUP BY t0.title;

祖先は、select ステートメントの非常に単純なサブクエリです。

子の場合、サブクエリ t3 は、MAX(lft) を持つ各ノードの先祖を見つけて隣接リストを作成し、次に t4 に結合して子の名前を取得します。

WHERE一番下に好きな句を入れてください。

于 2013-02-15T01:42:29.680 に答える
-2

MySQL のネストされたセットに関するこれらの優れた記事を読んでください http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/> http://explainextended.com/2009/03/17/hierarchical -mysql のクエリ/

于 2010-02-12T04:19:43.373 に答える