3

2 つの列を持つ「辞書」と呼ばれるシンプルだが巨大なテーブルがあります。IDと単語。特定の単語の可能なすべての組み合わせを作成するphpアナグラムアルゴリズムがあります。その単語が辞書に存在するかどうかを確認し、存在する場合は表示したいと思います。しかし、あまりにも多くのクエリを使用する必要があります。たとえば、9 文字の単語は 362880 の組み合わせです。より少ないdb呼び出しを行う方法について何か考えはありますか?

4

4 に答える 4

5

次のようなものを試してください。

SELECT word
FROM dictionary
WHERE word LIKE '%a%a%a%'
AND word LIKE '%n%'
AND word LIKE '%g%'
AND word LIKE '%r%'
AND word LIKE '%m%'
AND CHAR_LENGTH(word) = 7

さらに良いことに、並べ替えられた文字の配置を単語と一緒に保存し、クエリを実行するときに文字を並べ替えます。

SELECT word
FROM dictionary
WHERE sorted_word = 'aaagmnr'

sorted_word最高のパフォーマンスを得るには、インデックスを追加してください。

于 2012-05-08T21:22:57.337 に答える
1

はい、まず第一に、すべての順列を直接phpに変換します。次に、そのようなクエリを実行します

SELECT myWord FROM myTable
WHERE myWord in (LIST OF PERMUTATION FROM PHP)

その方法でどこLIST OF PERMUTATIONを計算できますか"' . implode( '", "', $permutations) . '"

于 2012-05-08T21:23:03.783 に答える
1

このようなクエリがどれほど効率的かはわかりませんが、1 つのクエリに対してのみ次のようなことを試してください。

$possibilities = array( "at", "ta");
$sql = 'SELECT * FROM dictionary_table 
            WHERE word IN ("' . implode( '", "', $possibilities) . '")';

これにより、SQL クエリが生成されます。

SELECT * FROM dictionary_table 
            WHERE word IN ("at", "ta")

利点は、クエリが動的であるため、いくつ$possibilitiesあっても理論的には機能することです。効率のために、私は間違いなく列にインデックスを付けwordます。

于 2012-05-08T21:22:52.307 に答える
0

テーブルの大きさはわかりませんが、サーバーに十分なメモリがあり、リクエスト内でこれを何度も実行する必要がある場合は、データベースをphpにロードし、phpに連想配列を使用して実行させます。

編集:または:すべての組み合わせを配列に入力し、サイズが100のジャンクに分割して、プリペアドステートメントを使用します。

于 2012-05-08T21:25:15.090 に答える