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