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