まず、あなたの質問の誤りを訂正したいと思います。クエリでは、_
を意味します %
ではありません 。 %
任意の数の文字(ゼロ以上)を意味します。 _
を使用する 正確に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%'