Първо искам да коригирам грешка във вашия въпрос. Във вашите заявки имате предвид _
не %
. %
означава произволен брой знаци (нула или повече). Използвайте _
означава точно един знак.
Сега към решението... всъщност нямате нужда от сортираната дума, съхранявана в базата данни. Можете просто да направите това:
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%'