0

データベースに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

しかし、これは、ap、a、n、またはtを含むすべての単語を出力することになります。

そして、すべての演算子をに切り替えるとAND、一致するものが1つだけになりますpant

この謎を解くのを手伝ってくれませんか。

文字列内の重複する文字を処理する方法にも関心があります。たとえば、プレーンがすべきではないPPANTのに、に一致するものを見つける必要があります。appPANT

私は関連付けテーブルで正しい方向に進んでいますか、それとももっと良い方法がありますか?

私はこれをphp/mysqlでかなり効率的に処理しようとしています。以前にC、perl、javaなどでこの謎を解いたことがある人がいることを私は知っています。

4

1 に答える 1

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

もちろん、テーブルを正規化する方法と、クエリを作成する複数の方法があります。自分の状況に最も適したものを試してみてください。

于 2012-10-28T03:50:37.217 に答える