Najpierw chcę poprawić błąd w twoim pytaniu. W swoich zapytaniach masz na myśli _ nie % . % oznacza dowolną liczbę znaków (zero lub więcej). Użyj _ oznaczać dokładnie jeden znak.
Przejdźmy teraz do rozwiązania... właściwie nie potrzebujesz posortowanego słowa przechowywanego w bazie danych. Możesz po prostu zrobić to:
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%'
Jeśli w danych wejściowych znajdują się zduplikowane litery, należy postępować z tym poprawnie, aby upewnić się, że wszystkie wyniki zawierają wszystkie zduplikowane litery. Na przykład, jeśli dane wejściowe to FOO__ musisz sprawdzić, czy każde słowo pasuje do obu %F% i %O%O% .
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND word LIKE '%F%'
AND word LIKE '%O%O%'
Zauważ, że to podejście będzie wymagało pełnego skanowania tabeli, więc nie będzie szczególnie wydajne. Możesz nieco poprawić sytuację, przechowując długość każdego słowa w osobnej kolumnie i indeksując tę kolumnę.
Jeśli masz sortedword wtedy możesz poprawić wydajność, pomijając % między zduplikowanymi literami, ponieważ wiesz, że pojawią się one kolejno w sortedword . Może to poprawić wydajność, ponieważ zmniejsza ilość cofania wymaganego w przypadku nieudanych meczów.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%'
AND sortedword LIKE '%OO%'
Kolejne podejście, które wymaga sortedword być obecnym w następujący sposób:
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%D%O%R%W%'
Ponownie wymaga to pełnego skanowania tabeli. Ponownie, jeśli masz powtarzające się litery, nie potrzebujesz % między nimi.
SELECT word
FROM dictionary
WHERE CHAR_LENGTH(word) = 5
AND sortedword LIKE '%F%OO%'