2012-05-11 79 views
1

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

如何我:

赛的字母结果信?

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

因为我有这肯定包含了很多的话一个庞大的数据库,我想在查询的回报:

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

不具有可能有两次使用了一封信任何其他结果。

我该如何解决这个问题?

非常感谢您的时间。

+0

不认为你可以只用SQL我。你更有可能获取所有记录并处理PHP方面的问题。 – Shoe

+0

尝试使用LIKE运算符:http://www.w3schools.com/sql/sql_like.asp – Onheiron

+0

我不知道任何全文是这样做的...... Google都没有......所以它必须被硬编码... – shadyyx

回答

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()进行比较。

+0

谢谢@robin。我根本不知道那个正则表达式可以作为SQL查询来执行。你可以请解释一下在查询和php代码中的正则表达式吗?非常感谢你。 – Phil

+0

添加了更多解释。 –

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 - 但是对于大多数编码人员来说,一个小程序可能会更加熟悉。

1

如果你想快速和肮脏的解决方案....

分割你正在试图获得字谜换入单个字母的单词。为每个字母分配一个单独的素数值,并将它们全部相乘;例如:

C - 2 
A - 3 
T - 5 

共30

然后通过你的词典列表步骤,并且做,每个字相同的操作。如果您的目标单词的值可以完全由字典单词的值整除,那么您知道字典单词只有在目标单词中出现的字母。

您可以通过预先计算的字典中的值,然后查询了正确的价值观加速这一过程: SELECT * FROM字典WHERE($ searchWordTotal%wordTotal)= 0 (searchWordTotal是总的字你要找的,和wordTotal是从数据库中一个)

我应该避开写的这些天这个正确的....

+0

非常聪明。 :)但为什么测试一个部门的其余部分,为什么不只是'WHERE $ searchWordTotal = wordTotal'? – ZeroOne

+1

如果你想找到重用所有字母的正确字母,那么是的,你会寻找匹配的字母;但海报也希望返回由某些字母组成的单词,在这种情况下,您需要进行模数检查。 现在我需要做的是找出如何轻松找到由多个单词组成的字谜,没有很多讨厌的编码.... – andrewsi

+0

其实...当这个例程完成时,我会列出一个列表这些词是主词的部分变体。所以如果一个单词不完全匹配,我可以计算出我仍然需要查找哪些字母,然后搜索我刚刚为具有这些字母的单词生成的列表。最重要的是,我甚至可以递归地做到这一点,所以它会选择多个单词。所以搜索TIGER会发现ERG;然后我可以在列表中搜索与TI匹配的词并找到它。为什么我会觉得我将在周末花这个代码呢? – andrewsi