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%'