这是一个混乱的问题 - 所以措辞似乎很难遵循。我可能会使一个简单的问题复杂化。添加了一个示例问题,以帮助解决这个问题。
使用字符hxinenvarbav从数据库中查找5个字母的单词。我已经在DB中组织了单词,也包含了按字母顺序排列的单词列。这意味着,单词“happy”有一个值为“ahppy”的列,所以从字母hxinenvarbav我可以使用以下代码按字母顺序组织它们。
<?
$letters = str_split('hxinenvarbav'); asort($letters);
$letters = implode('',$letters); // returns 'aabehinnrvvx'
?>
但是,我不能简单地用mysql“LIKE'%aabehinnrvvx%'搜索”并找到带有这些字符的5个字母的单词,显然这不会得到任何结果。除非我可以做MySQL查询吗?也许以不同方式组织专栏。但是,我可以使用str_split($ letters,5)来获取12个字母组合的5个字母块。
我将如何处理,从这12个字母中分成每个可能的5个字母组合,同时请记住,我需要查询表格。
这有意义吗?我需要进一步详细说明吗?可能,我只是过度思考,似乎无法简化我想要实现的目标。我有一些复杂的数学可以找到所有可能的组合。但由于我按字母顺序排列,我只搜索组合 - 而不是排列。最重要的是,我不会需要到逻辑上相信,查询'每个'组合。因为只有12个字母有792个可能的5个字母组合(不计算重复字符)。所以792查询调用并不好 - 我的查询中的792 OR语句显然不是一个选项。大声笑!。
有什么建议吗?
我只考虑通过字母表中剩下的可用字符进行搜索 - 但是,有些单词有重复的字母,所以这也不是一个选项。
答案 0 :(得分:1)
如果你有一个名为“dict”的表,其中包含“word”和“combo”字段,其中“combo”包含每个“word”的按字母顺序排列的字符,那么你可以在“combo”上编制索引。
您以编程方式在内存中构建您的组合集,并使用它根据每个组合使用IN子句构建SELECT语句,如“SELECT * FROM dict WHERE combo IN('combo1','combo2',... ,'comboN');“。
应该非常快速且易于实施。
答案 1 :(得分:0)
出于性能原因,您可能不会只使用一个SQL语句,而是SQL和后查询过滤的组合。
select * from A where word_len = 5 and (
substring( word_in_db, 1, 1) IN ('h', 'x', 'i', 'n', 'e', 'n', 'v', 'a', 'r', 'b', 'a', 'v')
and
substring( word_in_db, 2, 1) IN ('h', 'x', 'i', 'n', 'e', 'n', 'v', 'a', 'r', 'b', 'a',
-- etc...
)
这会将子句数量限制为目标词中的字母数量。
这不会发现重复,就像一个单词有2 Es,但输入字母只有1 E.您可能想要计算单词长度并将其保存为速度的派生值(当然,索引列,当然)。