Php 如何从字符数组中查找字符串匹配项?给定a,n,t,在单词列表中查找与ant,an,tan匹配的字符串
到目前为止,我的数据库中有27个表。一个单词表(拼字列表)和26个关联表Php 如何从字符数组中查找字符串匹配项?给定a,n,t,在单词列表中查找与ant,an,tan匹配的字符串,php,mysql,string,string-matching,Php,Mysql,String,String Matching,到目前为止,我的数据库中有27个表。一个单词表(拼字列表)和26个关联表 Table Fields ================ word [id,word] a [word_id,count] b [word_id,count] ... z [word_id,count] 我正试图找出给定字符串的匹配词 例如,如果给定的数组是a,n,t,我想知道:ant,tan,at,ta,an,na 我目前的策略是分解字符串中的每个字母,并找到与所有字母匹配的相关单
Table Fields
================
word [id,word]
a [word_id,count]
b [word_id,count]
...
z [word_id,count]
我正试图找出给定字符串的匹配词
例如,如果给定的数组是a,n,t
,我想知道:ant,tan,at,ta,an,na
我目前的策略是分解字符串中的每个字母,并找到与所有字母匹配的相关单词
例如:
SELECT word.word
FROM word, a, n, t
WHERE
word.id = a.word_id OR
word.id = n.word_id OR
word.id = t.word_id
但这最终会打印出所有包含a、n或t
的单词
如果我把所有操作符都切换到And,我只会遇到一个匹配项:ant
你能帮我解开这个谜吗
我还关心如何处理字符串中的重复字母。我认为字母关联表中的count
字段在这里会有所帮助。如果单词是app
,则p
关联表中的计数将为2
我使用关联表的方法正确吗?还是有更好的方法
我试图在php/mysql中相当有效地处理这个问题。我知道还有其他人以前用C、perl、java等语言解决过这个难题。如果你想要一个标准化的方法,那就是:
wordLetters{
INT wordID,
CHAR[1] letter,
INT count,
PK(wordID, letter)
}
words{
INT wordID PK,
VARCHAR(255) word UNIQUE
}
但是这种方法在性能方面有一个严重的问题——即它需要对单词表进行全表扫描。我将假设没有太多的信件,并建议采用这种方法:
words{
INT wordID PK,
VARCHAR(255) word UNIQUE,
INT cA KEY,
INT cB KEY,
...
INT cZ KEY,
KEY (cE, cT, cA, cO, cI, cN),
...
}
查找查询将很长,但它将有效地使用索引,并且它是由PHP代码生成的:
如果用户有[a,n,t]
,请按以下方式获取可用单词:
SELECT word FROM words WHERE
cA <= 1 AND cB = 0 AND cC = 0 AND ... AND cY = 0 AND cZ = 0
你能解释一下你是如何从
[a,n,t]
中得到你想要的吗它看起来像是一个任意的结果列表,pa
是如何进入a,n,t
的结果列表的?也许你最好使用正则表达式^[ant]+$
——但不确定这对你的特定问题有多适用。@JanDvorak,LOL,你是对的。已编辑。@deathApril,是的,a,n,t
是一个任意字符数组。它也可能是a,m,t
。但是产生的单词是实际单词(在拼字词典中),可以由相同的字符组成。本质上,我想输入一组字符,并快速列出从给定字符(使用全部或部分字符)生成的所有匹配单词。很有趣。你能详细解释一下关键策略(cE、cT、cA、cO、cI、cN)
吗?那些只是流行的信件吗?这就是你说我可以根据需要添加索引的意思吗?如中所示,如果索引也经常使用,请添加一个RSTLNE
键?@Ryan添加了关于索引的解释。哇,这太棒了。这么简单,它的工作!最后一个问题。我无法为多个字段设置键。您能否帮助我查询ETAOIN的ALTER TABLE
以设置此设置?请参阅。语法是ALTER TABLE words ADD INDEX i_etaoin(cE、cT、cA、cO、cI、cN)
其中i_etaoin
是索引名。如果不指定索引名,将生成一个索引名。
EXPLAIN EXTENDED
SELECT word FROM words
WHERE cA=0 AND cB<=1 AND cC=0 AND ...