0

これは紛らわしい問題です。そのため、言葉遣いを理解するのは難しいように思われるかもしれません。単純な問題を複雑にしすぎている可能性があります。これを理解するのに役立つ質問の例を追加しました。

質問例

文字 hxinvarbav を含むデータベースから 5 文字の単語を検索します。DB 内の単語を編成して、アルファベット形式の単語の列も含めました。つまり、"happy" という単語には "ahppy" という値の列があるため、次のコードを使用して文字 hxinenvarbav からアルファベット順に整理できます。

<?
    $letters = str_split('hxinenvarbav'); asort($letters);
    $letters = implode('',$letters); // returns 'aabehinnrvvx'
?>

問題

ただし、mysql「LIKE '%aabehinnrvvx%'」で単純に検索して、これらの文字を含む 5 文字の単語を見つけることはできません。明らかに結果が得られないためです。おそらく私ができるMySQLクエリがない限り? たぶん、列を別の方法で編成します。ただし、 str_split($letters,5) を使用して、12 文字の組み合わせから 5 文字のチャンクを取得できます。

これらの 12 文字から考えられる 5 文字の組み合わせをチャンクに分割しながら、テーブルにクエリを実行する必要があることを念頭に置いて、どうすればよいでしょうか。

これは理にかなっていますか?さらに詳しく説明する必要がありますか?おそらく、私は考えすぎて、達成しようとしていることを単純化できないようです。考えられるすべての組み合わせを見つけることができる複雑な数学があります。しかし、私はアルファベット順に配置したので、順列ではなく、組み合わせのみを検索しています。それに加えて、論理的に信じる限り、「各」組み合わせを照会する必要はありません。たった 12 文字から 792 の可能な 5 文字の組み合わせがあるため (繰り返しの文字を計算せずに)。したがって、792 回のクエリ呼び出しは適切ではありません。また、クエリ内の 792 個の OR ステートメントは明らかにオプションではありません。笑!。

助言がありますか?

アルファベットから離れた使用可能な文字で検索することを考えましたが、一部の単語には文字が繰り返されるため、それもオプションではありません.

4

2 に答える 2

1

フィールド「word」と「combo」を含む「dict」という名前のテーブルがある場合、「combo」には各「word」のアルファベット順の文字が含まれている場合、「combo」にインデックスを付けることができます。

組み合わせのセットをプログラムでメモリ内に作成し、それを使用して、IN 句を使用して各組み合わせに基づいて SELECT ステートメントを作成します。 ');".

かなり高速で実装が簡単なはずです。

于 2013-02-25T03:31:45.187 に答える
0

1 つの SQL ステートメントだけでこれを達成することはほとんどなく、パフォーマンス上の理由から、SQL とポスト クエリ フィルタリングを組み合わせて使用​​します。

select * from A where word_len = 5 and (
 substring( word_in_db, 1, 1) IN ('h', 'x', 'i', 'n', 'e', 'n', 'v', 'a', 'r', 'b', 'a', 'v')
 and 
 substring( word_in_db, 2, 1) IN ('h', 'x', 'i', 'n', 'e', 'n', 'v', 'a', 'r', 'b', 'a', 
-- etc...
)

これにより、句の量がターゲット単語の文字数に制限されます。

これは、E が 2 つあるが E が 1 つしかない入力文字のような単語のような重複を検出しません。おそらく、単語の長さを計算し、それを速度のために派生値として保存することをお勧めします (もちろん、列にインデックスを付けます)。

于 2013-02-26T14:33:14.347 に答える