首先,我想纠正您问题中的一个错误。在您的查询中,您的意思_
不是 %
。%
表示任意数量的字符(零个或多个)。用来_
表示一个字符。
现在开始解决方案......您实际上并不需要存储在数据库中的排序单词。你可以这样做:
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%'