给出以下数据库表:
WORDS
alphagram....varchar(15)
word.........varchar(15) PK
length.......int
其中:
我找到了一种通过SQL查找给定字母串的字谜的方法。例如,要找到AEINNRTT的字谜,这将起作用:
select alphagram, word, definition
from words
where length = 8
and alphagram like '%A%'
and alphagram like '%E%'
and alphagram like '%I%'
and alphagram like '%NN%'
and alphagram like '%R%'
and alphagram like '%TT%'
那将返回1行(对于INTRANET)
如果我想要包含已知数量的通配符,例如,INTRANET有多少单词+空白(通配符)我只需要将'长度'更改为字母总数+通配符数量
e.g。
select alphagram, word, definition
from words
where length = 9
and alphagram like '%A%'
and alphagram like '%E%'
and alphagram like '%I%'
and alphagram like '%NN%'
and alphagram like '%R%'
and alphagram like '%TT%'
...将返回8行(ENTERTAIN,INSTANTER,INTEGRANT,INTRANETS,ITINERANT,NATTERING,RATTENING和TRANSIENT)
我的问题是:是否有更有效的方法只通过SQL执行此操作?
这在SQLServer中运行得非常快,但在SqlLite中却相当慢。我意识到%xxx%的搜索速度并不快。
答案 0 :(得分:2)
您可以为每个条目创建一种索引列,该字母按字母顺序包含该单词的所有字母,然后进行比较。每个anagram将具有相同的索引值。
答案 1 :(得分:0)
一个想法是这样做(对于给定的字长):
将单词分成单个字符(可能在循环中使用SUBSTRING()
,但更好的方法可能值得单独定向的SO问题)
PROFIT!
尽管如此,作为一名评论者说,我强烈建议你在SQL之外做这件事,除非你有充分的理由不这样做或者你只是这样做来挑战你的技能。
答案 2 :(得分:0)
我想出这样做的最好方法是: 我创建了一个列... z 并解析每个单词并计算给定字母的出现次数并将其放在相应的列下 接下来,当我输入要解读的单词时,我计算了该单词的每个字母的每次出现,并将其与数据库中的单词进行比较 如果您需要进一步澄清,这可能有点难以理解,请告诉我
答案 3 :(得分:0)
这个问题已经过时了,我可能会误解某些内容,但似乎您的第一个请求可能是
select alphagram, word, definition
from words
where length = 8
and alphagram = 'AEINNRTT' and word <> alphagram
这是有效的,因为所有相同长度的字谜具有相同的alphagram。它将使用alphagram上的索引并且非常快。
长度&gt; 8个案例,有一个简单的场景更难,但我会尝试在表中添加26列:alpha_a,alpha_b,..包含alphagram中每个字母的数量。每个都可以有一个索引,然后你搜索
select alphagram, word, definition
from words
where length = 9
and alpha_a >= 1
and alpha_e >= 1
and alpha_i >= 1
and alpha_n >= 2
and alpha_r >= 1
and alpha_t >= 2