在string wordsolver应用程序中,如何从简单的mysql/php单词中的字符串中查找单词匹配?
我的数据库中有27个表。一个单词表是拼字列表,26个关联表在string wordsolver应用程序中,如何从简单的mysql/php单词中的字符串中查找单词匹配?,php,mysql,string,performance,Php,Mysql,String,Performance,我的数据库中有27个表。一个单词表是拼字列表,26个关联表 Table Fields ================ word [id,word] a [word_id] b [word_id] ... z [word_id] 我正试图找出给定字符串的匹配词 例如,如果给定的字符串是pant,我想知道:pant、apt、pat、tap、ant、tan、nap、pan、at、ta、pa、an、na 我目前的策略是分解字符串中的每个字母,并找到与所有字母匹配的
Table Fields
================
word [id,word]
a [word_id]
b [word_id]
...
z [word_id]
我正试图找出给定字符串的匹配词
例如,如果给定的字符串是pant,我想知道:pant、apt、pat、tap、ant、tan、nap、pan、at、ta、pa、an、na
我目前的策略是分解字符串中的每个字母,并找到与所有字母匹配的相关单词
例如:
SELECT word.word
FROM word, p, a, n, t
WHERE
word.id = p.word_id OR
word.id = a.word_id OR
word.id = n.word_id OR
word.id = t.word_id
但这最终会打印出所有包含p、a、n或t的单词
如果我把所有的操作符都切换到And,我只会遇到一个匹配项:pant
你能帮我解开这个谜吗
我还关心如何处理字符串中的重复字母。例如,PPANT应该为应用程序找到匹配项,而普通裤子不应该
我使用关联表的方法正确吗?还是有更好的方法
我试图在php/mysql中相当有效地处理这个问题。我知道还有其他人以前用C、perl、java等语言解决过这个难题。我不熟悉MySQL的高级功能,所以我不能说是否有办法按程序执行此限制,这可能会节省大量存储空间。尽管如此,我还是会提供这种可能性 假设这是您的word表格:
+==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
| word | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
+==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
| pant | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
+==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
| ppant | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
+==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
| app | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
| kick | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
那么您的查询可能如下所示:
SELECT word.word FROM word
JOIN
(
SELECT * FROM word WHERE word.word = "pant"
) AS root
ON
word.a <= root.a
AND word.b <= root.b
AND word.c <= root.c
AND word.d <= root.d
AND word.e <= root.e
AND word.f <= root.f
AND word.g <= root.g
AND word.h <= root.h
AND word.i <= root.i
AND word.j <= root.j
AND word.k <= root.k
AND word.l <= root.l
AND word.m <= root.m
AND word.n <= root.n
AND word.o <= root.o
AND word.p <= root.p
AND word.q <= root.q
AND word.r <= root.r
AND word.s <= root.s
AND word.t <= root.t
AND word.u <= root.u
AND word.v <= root.v
AND word.w <= root.w
AND word.x <= root.x
AND word.y <= root.y
AND word.z <= root.z
现在,当然有一些方法可以规范化表,还有多种方法可以创建查询。你应该尝试一下什么对你的情况最有意义。我不确定这将如何匹配没有确切字母要求的单词。例如,给定字符串:anppt,它将如何返回单词app?或者甚至考虑到你提到的字符串,anpt,你如何从中得到ant或at?你是对的Ryan。我的解决方案只能找到字谜。我已经更新了我的答案。