Mysql对anagram解算器的多个查询

时间:2012-05-08 21:19:37

标签: php mysql anagram

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

4 个答案:

答案 0 :(得分:4)

尝试这样的事情:

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

答案 1 :(得分: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列编入索引。

答案 2 :(得分:1)

是的,首先将所有排列直接转换为php。其次,做一个像这样的查询

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

LIST OF PERMUTATION可以通过这种方式计算"' . implode( '", "', $permutations) . '"

答案 3 :(得分:0)

我不知道你的桌子有多大,但如果你的服务器上有足够的内存,如果你必须在一个请求中多次这样做 - 将数据库加载到php并让php做,也许用关联数组。

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