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;