Мне нужно создать скрипт для поиска слов с «пробелами», которые в основном составляют% в sql.
$numberofblanks = 1; //max 13
$searchedword = "WORD";
$searchedwordsorted = "DORW";
Приведенные результаты должны быть следующими:
WORDY WORLD CROWD SWORD WORDS DOWRY ROWED DROWN DOWER ROWDY
% word, w% ord, wo% rd, wor% d, слово% будет, но как насчет более сложных запросов с двумя или более пробелами?
Также задавался вопросом, может ли поиск в searchwordorted какой-либо полезной или это действительно не имеет значения, и это просто пустая трата пространства в моем столе.
Благодарим вас за помощь.
.Майк
Сначала я хочу исправить ошибку в вашем вопросе. В ваших запросах вы подразумеваете _
not %
. Значение %
означает любое количество символов (ноль или более). Используйте _
для обозначения ровно одного символа.
Теперь на решение … вам действительно не нужно отсортированное слово, хранящееся в базе данных. Вы могли бы просто сделать это:
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%'