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