1

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

我怎样才能:

逐个字母匹配结果?

例如,假设我有字母 SLAOG 来匹配数据库条目。

由于我有一个肯定包含许多单词的大型数据库,因此我希望返回查询:

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

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

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

非常感谢您的宝贵时间。

4

3 回答 3

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()在 find the word 和 search word 中的每个字母上运行 a 以检查出现次数,并将它们与count().

于 2012-05-11T12:58:12.087 回答
1

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

将您尝试获取字谜的单词拆分为单个字母。为每个字母分配一个单独的素数值,并将它们相乘;例如:

C - 2
A - 3
T - 5

总共 30

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

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

这些天我应该好好写这篇文章....

于 2012-05-11T14:47:28.807 回答
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 中完成所有这些操作 - 但对于大多数编码人员来说,一个小过程可能看起来更熟悉。

于 2012-05-11T12:56:13.363 回答