2

「空白」を含む単語を検索するスクリプトを作成する必要があります。これは基本的にSQLでは%です。

$numberofblanks = 1; //max 13
$searchedword = "WORD";
$searchedwordsorted = "DORW";

結果は次のようになります
。WORDYWORLDCROWDSWORD WORDS DOWRY ROWED DROWN DOWER ROWDY

%word、w%ord、wo%rd、wor%d、word%で十分ですが、2つ以上の空白があるより複雑なクエリについてはどうでしょうか。
また、$ searchedwordsortedが役立つのか、それとも実際には問題ではなく、テーブルのスペースを無駄にしているだけなのか疑問に思っていました。

助けてくれてありがとう。
。マイク

4

1 に答える 1

3

まず、あなたの質問の誤りを訂正したいと思います。あなたのクエリでは、あなたはそうでは_ない ことを意味します%。は%任意の数の文字(ゼロ以上)を意味します。_正確に1文字を意味するために使用します。

さて、解決策に移りましょう...データベースに保存されているソートされた単語は実際には必要ありません。あなたはこれを行うことができます:

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 6
AND word LIKE '%W%'
AND word LIKE '%O%'
AND word LIKE '%R%'
AND word LIKE '%D%'

入力に重複する文字がある場合は、これを正しく処理して、すべての結果に重複する文字がすべて含まれるようにする必要があります。たとえば、入力がである場合、各単語がとの両方にFOO__一致することを確認する必要があります。%F%%O%O%

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'

このアプローチではテーブルのフルスキャンが必要になるため、特に効率的ではないことに注意してください。各単語の長さを別々の列に格納し、その列にインデックスを付けることで、状況を少し改善できます。


持っている場合は、重複する文字sortedwordの間を省略することでパフォーマンスを向上させることができます。これは%、重複する文字がに連続して表示されることがわかっているためですsortedword。これにより、失敗した一致に必要なバックトラックの量が減るため、パフォーマンスが向上する可能性があります。

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'

存在する必要がある別のアプローチsortedwordは次のとおりです。

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'

この場合も、テーブルを完全にスキャンする必要があります。繰り返しますが、文字を繰り返している場合は%、それらの間に必要はありません。

SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'
于 2012-08-26T11:07:57.430 に答える