Php 如何从字符数组中查找字符串匹配项?给定a,n,t,在单词列表中查找与ant,an,tan匹配的字符串

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 我目前的策略是分解字符串中的每个字母,并找到与所有字母匹配的相关单

到目前为止,我的数据库中有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

我目前的策略是分解字符串中的每个字母,并找到与所有字母匹配的相关单词

例如:

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 ...