【问题标题】:How can I find word matches from a string in a simple mysql/php words in string wordsolver app?如何从字符串 wordsolver 应用程序中的简单 mysql/php 单词中的字符串中找到单词匹配?
【发布时间】:2012-10-17 20:33:22
【问题描述】:

我的数据库中有 27 个表。 1个单词表(拼字游戏单词表),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

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

例如:

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 应该找到 app 的匹配项,而普通的 PANT 则不应该。

我是否在关联表的正确轨道上或有更好的方法?

我试图在 php/mysql 中相当有效地处理这个问题。我知道以前有其他人用 C、perl、java 等解决过这个谜题。

【问题讨论】:

    标签: php mysql string performance


    【解决方案1】:

    我不熟悉 MySQL 的高级功能,所以我不能说是否有办法在程序上执行此限制,这可能会为您节省大量存储空间。尽管如此,我还是会提供这种可能性。

    说这是你的单词表:

    +==========+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+===+
    |   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,你怎么会从中得到antat
    • 你说得对,瑞恩。我的解决方案只能找到字谜。我已经更新了我的答案。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2010-12-15
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多