Mysql 多个查询用于字谜求解器


Mysql multiple queries for anagram solver

我有一个简单但巨大的表格,叫做'dictionary',有2列。ID 和单词。我有一个php字谜算法,它创建了给定单词的所有可能组合。我想看看这个词是否存在在我的字典中,如果是,则显示它。但是我必须使用太多查询。例如,一个 9 个字母的单词是 362880 个组合。知道如何进行更少的数据库调用吗?

尝试这样的事情:

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上添加索引以获得最佳性能。

只对一个查询尝试这样的事情,尽管我不知道这样的查询效率如何:

$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列。

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

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

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

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

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