2012-05-11 24 views
1

私は、MySQLの学習とクエリの過程にあり、現在はPHPで作業しています。 学習目的のために、小さなアナグラムソルバーのプロジェクトを選択しました。 DBとして自由に利用できるインターネット上の非常に古い英語の単語リストが見つかりました。 私は照会しようとしましたが、セットとフルテキスト検索が一致するが見つかりませんでした。mysql:クエリ文字と文字を一致させる

どうすればいいですか?

結果の文字を文字で入力してください。

たとえば、データベースエントリと照合する文字がS-L-A-O-Gであるとします。

私は確かに多くの単語が含まれている大規模なデータベースを持っているので、私は、クエリの見返りに持ちたい:2回使用の手紙を持っている可能性のある他の結果をせずに

lag 
goal 
goals 
slag 
log 
... and so on. 

これをSQLでどのように解決できますか?

ありがとうございます。

+0

を探し直す、とwordTotalはデータベースから1である)

。それはあなたがすべてのレコードを取得し、それらをPHP側で処理する可能性が高いです。 – Shoe

+0

LIKE演算子で試してみてください:http://www.w3schools.com/sql/sql_like.asp – Onheiron

+0

これを行っている全文についてわかりません... Googleはどちらもしません...だから、ハードコードされている必要があります... – shadyyx

答えて

1
$str_search = 'SLAOG'; 

SELECT word 
FROM table_name 
WHERE word REGEXP '^[{$str_search}]+$' # '^[SLAOG]+$' 

// Filter the results in php afterwards 

// Loop START 

$arr = array(); 
for($i = 0; $i < strlen($row->word); $i++) { 

    $h = substr($str_search, $i, 0); 
    preg_match_all("/{$h}/", $row->word, $arr_matches); 
    preg_match_all("/{$h}/", $str_search, $arr_matches2); 

    if (count($arr_matches[0]) > count($arr_matches2[0])) 
     FALSE; // Amount doesn't add up 

} 

// Loop END 

指定された単語に対して基本的にREGEXPを実行し、その単語が検索語と比較された回数を基準にします。

REGEXPは、指定された単語の組み合わせで、最初から最後までのすべての列を検査します。これにより、より多くの行が必要になる場合がありますが、それにもかかわらず素晴らしいフィルタが得られます。

ループ部分は、検索文字列で文字が何度も使用されている単語をフィルタリングすることです。私はそれぞれの文字の中にpreg_match_all()をつけて、その単語と検索語を見つけ出し、出現量を確認して、それをcount()と比較します。

+0

ありがとうございます。私は正規表現がSQLクエリとして実行できることを全く知らなかった。あなたは親切に質問とPHPコードの正規表現を少し説明していただけますか?どうもありがとうございました。 – Phil

+0

詳細な説明が追加されました。 –

0

あなたが唯一の特定の文字を含む単語、および無他人をしたいが、あなたはすべての文字を使用する必要がいけないため、その後、私はこのようなロジックを提案:

* take your candidate word, 
* do a string replace of the first occurrence of each letter in your match set, 
* set the new value to null 
* then finally wrap all that in a strlength to see if there are any characters left. 

あなたはSQLですべてのことを行うことができます - ほとんどのコーダーには少しの手順が馴染んでいます。

1

あなたが迅速かつ汚いソリューションをしたい場合は....

を使用すると、個々の文字にのためのアナグラムを取得しようとしている単語を分割します。各文字に個々の素数値を割り当て、それらをすべて一緒に掛けます。例えば:30

の合計

C - 2 
A - 3 
T - 5 

は、その後、あなたの辞書のリストをステップ実行し、その中の各単語に対して同じ操作を行います。あなたの目標単語の値が辞書単語の値で正確に割り切れるならば、あなたはその辞書単語があなたの目標単語に現れる文字だけを持っていることを知っています。

あなたは辞書の値を事前に計算することによって、それをスピードアップして、ちょうど右の値を照会することができます($ searchWordTotal%wordTotal)辞書から SELECT * = 0 (searchWordTotalは単語あなたの合計であります「私はあなただけのSQLでできるとは思わない、私は適切にこれらの日のいずれかをこれを書くことに周りに取得する必要....

+0

それはすごく賢いです。 :)しかし、なぜ除算の残りの部分をテストするのですか?単にWHERE $ searchWordTotal = wordTotal'ではないのですか? – ZeroOne

+1

すべての文字を再利用する適切なアナグラムを探したい場合は、一致するものを探します。ポスターはまた、いくつかの文字で構成された単語を返すことを望んでいました。この場合、モジュラスチェックを行う必要があります。 私が今必要とするのは、複数の単語からなるアナグラムを簡単に見つけ出す方法です。 – andrewsi

+0

実際には...このルーチンが終了するまでに、私はリストを作成しますメインワードの部分的なアナグラムである単語のしたがって、単語が完全一致でない場合は、検索する必要のある文字を把握し、作成したリストを検索することができます。そして、大きな部分は、私は再帰的にそれを行うこともできるので、それは複数の単語をピックアップします。したがって、TIGERを検索するとERGが見つかります。 TIの検索語に一致する単語を検索してITを見つけることができます。なぜ私は週末にこれをコーディングしていると感じているのですか? – andrewsi

関連する問題