Mysql对字谜求解器的多个查询
Posted
技术标签:
【中文标题】Mysql对字谜求解器的多个查询【英文标题】:Mysql multiple queries for anagram solver 【发布时间】:2012-05-17 09:53:35 【问题描述】:我有一个名为“字典”的简单但巨大的表,它有 2 列。 ID 和单词。 我有一个 php 字谜算法,它可以创建给定单词的所有可能组合。我想检查该词是否存在于我的字典中,如果存在则显示它。但我必须使用太多查询。例如,一个 9 个字母的单词是 362880 个组合。知道如何减少数据库调用吗?
【问题讨论】:
您应该为此使用Sphinx
。
"例如一个 9 个字母的单词是 362880 个组合"。我认为你的意思是排列。
【参考方案1】:
试试这样的:
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
上添加索引以获得最佳性能。
【讨论】:
根据你的业力等级,你可能不需要随机的人告诉你你很聪明,但这非常聪明。【参考方案2】:只对一个查询尝试这样的事情,虽然我不知道这样的查询会有多有效:
$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
列。
【讨论】:
我只是在写同样的东西。只是,选择(显式)单词列而不是 * 更快。是的 - 确保该列已编入索引。 谢谢你,尼克。我已经尝试了其他人提供的所有解决方案,但您的解决方案是最简单、最快捷的,而且我只使用了 1 个查询!【参考方案3】:是的,首先将所有排列直接放入php中。其次,做这样的查询
SELECT myWord FROM myTable
WHERE myWord in (LIST OF PERMUTATION FROM PHP)
LIST OF PERMUTATION
可以用这种方式计算 "' . implode( '", "', $permutations) . '"
【讨论】:
这有点有趣,像这样颠倒逻辑。不是测试单词是否在数据库中,而是测试数据库中的单词是否在排列列表中。对于长字,您可能需要增加max_allowed_packet
,如 dev.mysql.com/doc/refman/5.0/en/packet-too-large.html 中所述——此查询的大小很容易增长到数 MB。
@octern : 是的,如果你不做n
查询,你必须做类似的事情,或者做一个select
的所有单词,将它加载到内存到PHP 端和检查返回的数组中是否存在置换词之一。
如果不清楚,我是说我喜欢你的解决方案。
@octern :是的,我注意到了,但我也解释了为什么我认为这几乎是唯一的好解决方案 :)【参考方案4】:
我不知道你的表有多大,但如果你在服务器上有足够的内存,并且如果你必须在一个请求中多次执行此操作 - 将数据库加载到 php 并让 php 执行它,也许使用关联数组。
编辑: 或者:将所有组合输入一个数组,将其拆分为大小为 100 的垃圾并使用准备好的语句。
【讨论】:
以上是关于Mysql对字谜求解器的多个查询的主要内容,如果未能解决你的问题,请参考以下文章