2

以下は私の2つのSQLテーブルです。

表1                                                                       表2

+ ------- + ------------------------- + + ------- + ------ ------------------------ +
| USD | モデル| | USD | モデル|
+ ------- + ------------------------- + + ------- + ------ ------------------------ +
| 700 | iPad 2 WiFi 16GB | | 710 | iPad2 WiFi 16GB |
| 400 | iPhone 4S 16GB | | 450 | iPhone4S 16GB |
| 250 | iPod Touch(第4世代)8GB | | 200 |iPodTouch第4世代8GB|
+ ------- + ------------------------- + + ------- + ------ ------------------------ +

2つの異なるテーブルに存在するデータをインテリジェントに比較することに固執しています。私は検索や比較の文脈でたくさん掘り下げました、そして私は見つけました

  • 類似のテキスト()
  • soundex()
  • metaphones()
  • レーベンシュタイン()
  • お気に入り
  • 全文
  • 正規表現

... PHPとMySQLでは、しかしそれらはすべて効率的ではありません。similar_textLEVENSHTEINは本当に良いのですが、最悪の欠点は、1000行で非常に遅く、「iphone」と「ipad」のように同じではないアイテムに対して同じサウンドを返すことです。すべてsoundex()Imetaphonesやりたいのは、上記の例の「iPhone4S16GB」と「iPhone4S16GB」のような2つの行を効率的に比較することです。私のソリューションは、このような行を比較するためにすばやく機能するはずです。クエリを解決できるように、比較するためのオプションを教えてください。どんなアイデアでも、どんなヒントでも本当にありがたいです。

注:私の1つのテーブルには、約900行が含まれています。

これは次の続きです。

2つのアレイを比較し、WRTUSDを並べ替えます

2つのテーブル列間でmysqlと比較するパターン

4

4 に答える 4

2

複雑であるが、より良い結果を生み出す可能性が高いソリューションが気に入らない場合は、テキスト文字列からスペースを削除して、単純な文字列比較を試してみてください。または、すべてのUPPERに変換することもできます。次に、スペースなしで比較します。

それは少なくともあなたが述べた「類似性」の例を解決するでしょう。

于 2012-11-18T16:15:23.397 に答える
1

1つの方法は、スペースの文字列'('、')'を削除し、'Generation'を'Gen'に置き換える関数/ストアドプロシージャを作成することです。その後、「strip_unnecessary()」関数を適用する「モデル」フィールドを除いて、現在のテーブルと同じ2つの一時テーブルを作成できます。これで、テーブルを結合するか、他の方法でテーブルを比較するだけで済みます。

一時テーブルを使用するトリックは実行時間を節約しますが、このクエリを頻繁に実行する場合は、パフォーマンスを向上させるために代わりにビューを使用することを検討してください。

このソリューションは、「strip_unnecessary()」関数がどれだけ優れているか、および「Model」フィールドの内容を事前に知っているかどうかに大きく依存します。

于 2012-11-18T16:21:34.070 に答える
1

スパム検出器を実行するときに、この種のことを取り上げました(大量の調査を行い、後でアイデアを捨てましたが、先に進みます...)。

基本的に、のように使用しないでください。大きなテキストでは遅くなり、インデックスは制限されます。たとえば、次のようになります。

LIKE'%hello'はインデックスを使用できませんが、LIKE'hello%'は使用できます。また、フィールドが大きいと、意図したとおりに機能するようにインデックスが大きくなります(たとえば、短い傾向のある電子メールアドレスでも問題ありません)。

=を使用します。これは、大文字と小文字を区別せず、このために必要です。

次に、すでに解析されたmetaphone()表現を含む新しいフィールドをテーブルに追加します(これは、1回だけ計算する必要があることを意味します)。

これで、たとえば1000レコードのテーブルが作成され、それぞれにメタフォンバージョンとオリジナルが含まれます。必要な効率を得るには、これを行う必要があります。テキストがすでに存在するかどうかを確認したい場合は、新しいテキストをそのmetephoneバージョンに変換してから、dbテーブルでそのテキストを検索します(metephoneの解析済みフィールドで検索します)。はるかに速い;)

精度を向上させるために、一般的な単語をすべて削除し、次のような句読点を削除することをお勧めします。

  • および=削除
  • 、=削除
  • '=削除
  • 持っている=削除された
  • それは=そのまたはそれは(あなたがどちらを好むかに応じて)

次に、5つのスペースなど、複数の空白をすべて1つのスペースに結合します。

あなたがしていることの性質は、あなたがそれを必要とするもののためにそれを完成させるためにあなたがすることができる何百もの小さな微調整を持っているでしょう。

于 2012-11-18T17:20:51.990 に答える
0

mysqlの観点から、解決策は次のとおりです。

SELECT *
FROM tb1
WHERE (USD, Model) NOT IN (SELECT USD, Model FROM tb2)
于 2012-11-18T16:26:39.720 に答える