0

この記事からフルパスを取得するコードを変更しようとしています。完全一致の代わりにFULLTEXTを使用するネストセットモデルの http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/です。MySQL FULLTEXTのみがベストアンサーを返す

私が欲しいものは次のとおりです:MATCH()AGAINST()で検索し、この「=」記号を使用するよりも、

は、ここで私が試したものです:

DELIMITER // 
DROP PROCEDURE IF EXISTS find_node; 
// 

CREATE DEFINER = CURRENT_USER PROCEDURE find_node (
     IN searched TEXT 
) 

proc: BEGIN 

    SELECT DISTINCT parent.content 
    FROM tree AS node, 
      tree AS parent 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.content = (SELECT content FROM tree WHERE MATCH(node.content) AGAINST(searched IN BOOLEAN MODE) LIMIT 1) 
    ORDER BY parent.lft; 

END // 
DELIMITER ; 

でbegginingラインとnode.contentを、それは手順を実行した後にすべての結果を返していないようです。 2番目、3番目、n番目のベストマッチを取得したいと考えています(LIMIT 1 OFFSET n、nは結果番号ですか?)。

ありがとうございました

答えて

0

これは論理的に賢明ではありません。サブクエリをもう一度見てください。

SELECT content 
    FROM tree /* << tree? */ 
WHERE MATCH(node.content) /* << node? */ ... 

ここのテーブルはtreeです。 nodeの列に対する一致を指定すると、treeには合理的な選択基準は適用されませんが、WHERE 1またはWHERE 1 = 1またはWHERE 2+2 != 5のように、またはtreeのような行はWHERE 1 = 0と全く同じように、ツリーのすべての行に一致します。サーバーはすべての行LIMIT 1,を返し、その1行が正しい 'コンテンツ'を提供しない場合、外部クエリは行を返しません。またはWHEREが満たすことができないため、サブクエリは行を返しません。それ以上の分析は必要ありませんが、書かれているように、クエリはあなたが意図したことをしていないようです。

私はあなたがこれを意図したと信じて:

WHERE MATCH(tree.content) AGAINST ... 

私は私はあなたが本当に達成しようとしているものに対する解決策として、アプローチの有効性を完全には納得していない午前認めるが、これは論理的なように思えます「結果なし」と表示されるエラー。

データベース管理者用のスタック交換サイトであるdba.SEのMYSQL matching one column to another in a different table via a FULLTEXT indexに対する私の回答にも価値があるかもしれません。もちろん、「別のテーブル」では、この問題は実際には結合を参照していたので、このソリューションはテーブルをそれ自身に結合するのにも役立ちます。このソリューションでは、ストアドファンクションを使用して、AGAINST()の列参照の制限を緩和しますが、これは不要ですが、LIMIT 1も処理してスカラー値を取得します。

しかし、複数の行が必要な場合、スカラーサブクエリまたはストアド関数が正しくないように思われます。派生テーブルが必要です。これはMySQLがsubquery in the FROM clauseと呼んでいます。導出表のLIMITのサポートは、サーバーのバージョン、IIRCによって異なります。

関連する問題