3

我有一个名为“字典”的简单但巨大的表,它有 2 列。ID 和单词。我有一个 php 字谜算法,它可以创建给定单词的所有可能组合。我想检查该词是否存在于我的字典中,如果存在则显示它。但我必须使用太多查询。例如,一个 9 个字母的单词是 362880 个组合。知道如何减少数据库调用吗?

4

4 回答 4

5

尝试这样的事情:

SELECT word
FROM dictionary
WHERE word LIKE '%a%a%a%'
AND word LIKE '%n%'
AND word LIKE '%g%'
AND word LIKE '%r%'
AND word LIKE '%m%'
AND CHAR_LENGTH(word) = 7

更好的是,将排序后的字母排列与单词一起存储,并在查询时对字母进行排序。

SELECT word
FROM dictionary
WHERE sorted_word = 'aaagmnr'

添加索引以sorted_word获得最佳性能。

于 2012-05-08T21:22:57.337 回答
1

只为一个查询尝试这样的事情,虽然我不知道这样的查询会有多有效:

$possibilities = array( "at", "ta");
$sql = 'SELECT * FROM dictionary_table 
            WHERE word IN ("' . implode( '", "', $possibilities) . '")';

这将生成 SQL 查询:

SELECT * FROM dictionary_table 
            WHERE word IN ("at", "ta")

好处是查询是动态的,所以无论$possibilities有多少,这在理论上都是可行的。为了提高效率,我肯定会索引该word列。

于 2012-05-08T21:22:52.307 回答
1

是的,首先将所有排列直接放入 php。其次,做这样的查询

SELECT myWord FROM myTable
WHERE myWord in (LIST OF PERMUTATION FROM PHP)

哪里LIST OF PERMUTATION可以这样计算"' . implode( '", "', $permutations) . '"

于 2012-05-08T21:23:03.783 回答
0

我不知道您的表有多大,但是如果您在服务器上有足够的内存并且您必须在请求中多次执行此操作 - 将数据库加载到 php 并让 php 执行此操作,可能使用关联数组。

编辑:或者:将所有组合输入到一个数组中,将其拆分为大小为 100 的垃圾并使用准备好的语句。

于 2012-05-08T21:25:15.090 回答