mysql:逐字母匹配查询

时间:2012-05-11 12:48:13

标签: php mysql

我正在学习MySQL和查询,现在正在使用PHP开始。 出于学习目的,我选择了一个小的anagram求解器项目。 我在互联网上找到了一个非常古老的英语单词列表,可以免费用作数据库。 我尝试查询,找到集合和全文搜索匹配但失败了。

我怎么能:

逐个字母地匹配结果?

例如,假设我有字母S-L-A-O-G与数据库条目匹配。

由于我有一个肯定包含很多单词的大型数据库,我想要回复查询:

lag
goal
goals
slag
log
... and so on.

没有任何其他可能会使用两次字母的结果。

我如何用SQL解决这个问题?

非常感谢你的时间。

3 个答案:

答案 0 :(得分:1)

$str_search = 'SLAOG';

SELECT word
FROM table_name
WHERE word REGEXP '^[{$str_search}]+$' # '^[SLAOG]+$'

// Filter the results in php afterwards

// Loop START

$arr = array();
for($i = 0; $i < strlen($row->word); $i++) {

    $h = substr($str_search, $i, 0);
    preg_match_all("/{$h}/", $row->word, $arr_matches);
    preg_match_all("/{$h}/", $str_search, $arr_matches2);

    if (count($arr_matches[0]) > count($arr_matches2[0]))
        FALSE; // Amount doesn't add up

}

// Loop END

基本上对给定的单词运行REGEXP,并根据单词与搜索单词的比较数量来过滤结果。

REGEXP使用给定单词的组合从头到尾检查所有列。这可能会导致您需要更多的行,但它仍会提供一个很好的过滤器。

循环部分用于过滤字母在搜索字符串中使用次数的次数。我在每个字母上运行preg_match_all()找到了单词和搜索字,以检查发生的数量,并将其与count()进行比较。

答案 1 :(得分:1)

如果你想要一个快速而肮脏的解决方案......

将你想要字谜的单词分成单个字母。为每个字母分配一个单独的素数值,并将它们相乘;例如:

C - 2
A - 3
T - 5

共30个

然后逐步浏览字典列表,并对其中的每个单词执行相同的操作。如果您的目标单词的值可以完全被字典单词的值整除,那么您就知道字典单词只包含目标单词中出现的字母。

您可以通过预先计算字典值来加快速度,然后查询正确的值: SELECT * FROM dictionary WHERE($ searchWordTotal%wordTotal)= 0 (searchWordTotal是您要查找的单词的总和,wordTotal是数据库中的单词)

我应该在这些日子里正确地写这个......

答案 2 :(得分:0)

既然你只想要带有字母的单词,而不是其他单词,但你不需要使用所有的字母,那么我建议使用这样的逻辑:

* take your candidate word,
* do a string replace of the first occurrence of each letter in your match set,
* set the new value to null
* then finally wrap all that in a strlength to see if there are any characters left.

你可以在sql中完成所有这些 - 但对于大多数程序员来说,一个小程序可能看起来更熟悉。