2

我需要创建一个脚本来搜索带有“空格”的单词,这些单词在 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, word% 可以,但是如果更复杂的查询有 2 个或更多空格呢?
还想知道 $searchedwordsorted 是否有帮助或者它并不重要,这只是浪费我的桌子上的空间。

谢谢你们的帮助。
。麦克风

4

1 回答 1

3

首先,我想纠正您问题中的一个错误。在您的查询中,您的意思_不是 %%表示任意数量的字符(零个或多个)。用来_表示一个字符。

现在开始解决方案......您实际上并不需要存储在数据库中的排序单词。你可以这样做:

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%'
于 2012-08-26T11:07:57.430 回答