用sql的%字anagrammer

时间:2012-08-26 11:04:26

标签: php mysql

我需要创建一个脚本来搜索带有'blanks'的单词,这些单词在sql中基本上是%。

$numberofblanks = 1; //max 13
$searchedword = "WORD";
$searchedwordsorted = "DORW";

给出的结果应该是:
罗唆 世界 人群 剑 话 嫁妆 划 淹 嫁妆 吵闹的

%word,w%ord,wo%rd,wor%d,word%会这样做,但更复杂的查询呢,有2个或更多空格?
还想知道$ searchwordsorted是否有用,或者它并不重要,这只是浪费我桌上的空间。

谢谢你的帮助。
.mike

1 个答案:

答案 0 :(得分: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%'