2011-12-06 11 views
3

私はちょうど答えを見つけることができないという問題があります。私はMySQLで動くPHPのような非常に小さなCRMアプリケーションを開発しました。このアプリケーションのユーザーは、アップロードされたCSVファイルを使用して新しいデータをデータベースにインポートできます。現在解決しようとしている課題の1つは重複していることです。私は以下の持っている場合たとえば、:MySQL同様の行を削除/結合

Record A: [1, Bob, Jones, Atlanta, GA, 30327, (404) 555-1234] 

Record B: [2, Bobby, Jones, Atlanta, GA, 30327, Bob's Shoe Store, (404) 555-1234] 

私は、これらは両方とも類似していることを確認する方法が必要と、(この場合はレコードBに)より多くの情報を持つレコードを取得し、レコードを削除します。

しかし、ここではさらに複雑になります。これは、新しいデータのインポート時に実行する必要がありますし、いつでもデータベースから重複を削除するために実行できる関数です。私はMySQLテーブルからすべての重複行を取得し、電話番号でそれらを一致させる何かを一緒にPHPに入れることができました、または行のすべての列にimplode()を使用し、strlen() 。 これを行うにはより良い方法が必要であり、より正確な方法があるはずです。

あなたが実装したりビルドしたりできる賢明な提案はありますか?新しいデータをインポートするときは、CSVファイルを配列または一時的なMySQLテーブルに開く必要があります。重複/類似検索を行い、CSVファイルを再コンパイルするか、一時テーブルからメインテーブルにすべてを追加してください。おもう。 :)

あなたの誰かが私が紛失しているかもしれない何かを指摘できると思っています。私はむしろ、5,000レコードではなく、5レコードの長さのユーザーに「不確実」な重複のリストを提示したいと考えています。

ありがとうございます! アレックス

答えて

0

私は華麗な解決策はないと思います。類似性を検出するために頼ることのできるデータフィールドの優先順位(電話、ID、ある種の統一された住所または正式な名前など)を決定する必要があります。 レコードの追加時に類似検索に使用できる行とともに、いくつかのクリーンアップされた値を保存できます(電話機の数字だけのような同じ形式に縮小され、完全なアドレスが連結されています)。 その後、より完全なフィールドで既存の行を更新するか、古い行を削除して新しい行を追加するために、データ完全性を決定する必要があります。

このような変数タスクのための準備ができていない解決策はありません。

2

もし私がユニークキーをnamesurnamephone numberに与えたいのであれば、理論上、これらの3つがすべて等しいとすると、それは複製であることを意味します。電話番号に所有者が1人しかいないため、私はそう思っています。とにかく、2〜3列か4列の組み合わせを見つけ、それらに一意のキーを割り当てる必要があります。挿入された値が重複している場合

// assuming that you have defined something like the following in your CREATE TABLE: 
UNIQUE(phone, name, surname) 
// then you should perform something like: 
INSERT INTO your_table (phone, name, surname) VALUES ($val1, $val2, $val3) 
ON DUPLICATE KEY UPDATE phone = IFNULL($val1, phone), 
         name = IFNULL($val2, name), 
         surname = IFNULL($val3, surname); 

だから、基本的には、このコードではなく、新しいものを挿入するよりも、行を更新します:あなたは、このような構造を持っていたら、このような何かを実行します。 IFNULL関数は、最初の式がnullかどうかをチェックします。値がNULLの場合は、2番目の式が選択されます。この場合は、すでにテーブルに存在する列の値です。したがって、可能な限り多くの情報で行を更新します。

関連する問題