次のようなテーブルに文字列が格納されています。
1. "the quick brown fox"
2. "the quick brown fox jumps"
3. "the quick brown fox jumps over the lazy dog"
4. "the quick potato does nothing"
そして、3つの入力単語が与えられた場合、文字列に3つの単語がすべて見つかったときに、そのエントリを返します。
だから私はこれをやっています:
WHERE word1 IN stringfield AND word2 IN stringfield AND word3 IN stringfeild
ただし、オプションで追加の入力単語を提供して、入力単語に最も一致するエントリで結果をフィルタリングしたいと思います。したがって、返されるすべての一致には、少なくとも3つの一致があります。
したがって、たとえば次の入力ワード:
"the", "quick", "brown", "fox", "jumps", "over"
戻り値:
3.
2.
1.
3が最も一致するので、次に2、次に1です。そして、少なくとも3つの一致が含まれていなかったため、4は選択されません。
それは可能ですか?そして、これはそれを行うための最速の方法ですか、それともジャンクションテーブルを使用する方が良いでしょうか?もしそうなら、どのように?本当にありがとう。
まず、MySQLのフルテキスト機能を使用するのが最善かもしれません。ここでそれについて読んでください。
where
句を動的に作成していると想定しているので、5つの単語がある場合は、次のように作成できます。
WHERE stringfield LIKE '%word1%' OR
stringfield LIKE '%word2%' OR
stringfield LIKE '%word3%' OR
stringfield LIKE '%word4%' OR
stringfield LIKE '%word5%'
IN
オペレータは、単にあなたがそれをやっていると思う何をしません。
これを実行できる場合、完全なクエリには次のものも含まれます。
WHERE ((stringfield LIKE '%word1%') +
(stringfield LIKE '%word2%') +
(stringfield LIKE '%word3%') +
(stringfield LIKE '%word4%') +
(stringfield LIKE '%word5%')
) >= 3
ORDER BY ((stringfield LIKE '%word1%') +
(stringfield LIKE '%word2%') +
(stringfield LIKE '%word3%') +
(stringfield LIKE '%word4%') +
(stringfield LIKE '%word5%')
) DESC
MySQLは、ブール式を数値コンテキストの整数として扱います。これにより、一致数のカウントが特に簡単になります。しかし、私が言うように、フルテキストインデックスはあなたが本当に必要とするものかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加