2012-04-09 4 views
2

と重複する顧客のためにSeaching:この状況でが、私はこのようになりますテーブル内の重複顧客を見つけようとしているLIKE

customer_id | first_name | last_name 
------------------------------------- 
      0 | Rich  | Smith 
      1 | Paul  | Jones 
      2 | Richard | Smith 
      3 | Jimmy  | Roberts 

、私はCUSTOMER_ID 0とCUSTOMER_ID 2で返されたクエリを必要としています。このクエリでは、顧客が名前を短縮した可能性がある場所、リチャードの代わりにRich、ロバートの代わりにRobを検索する必要があります。

私はこのクエリを持っていますが、一致のうちの1つ(両方ではない)だけを返します。私は両方のリッチが必要です&リチャードはクエリによって返されました。

select distinct customers.customer_id, concat(customers.first_name,' ',customers.last_name) as name from customers 
inner join customers dup on customers.last_name = dup.last_name 
where (dup.first_name like concat('%', customers.first_name, '%') 
and dup.customer_id <> customers.customer_id) 
order by name 

誰かが正しい方向に向いていますか? @tsOverflowパー

、これは私の問題を解決し、最終的なクエリです:

select distinct customers.customer_id, concat(customers.first_name,' ',customers.last_name) as name 
from customers 
    inner join customers dup on customers.last_name = dup.last_name 
where ((dup.first_name like concat('%', customers.first_name, '%') 
      OR (customers.first_name like concat('%', dup.first_name, '%')) 
     ) 
    and dup.customer_id <> customers.customer_id) 
order by name 

上記の溶液は、パフォーマンスの問題を有することができます。

+0

MySQLが「リチャード」という名前を「リッチ」にするのはどうでしょうか? –

+1

問題を解決するには2次情報が必要です。情報を入力した人によっては、マイク=マイク、マイク=マイケル、ジョー=ジョゼフジョー=ジョーン=とジョーン= 'リッチスミス' = 'リチャードスミス'? – Karlson

答えて

1

リッチはリチャードの部分文字列ですが、その逆はありません。

これは、両方の方法をチェックします:

select distinct randomtest.customer_id, concat(randomtest.first_name,' ',randomtest.last_name) as name 
from randomtest 
    inner join randomtest dup on randomtest.last_name = dup.last_name 
where ((dup.first_name like concat('%', randomtest.first_name, '%') 
      OR (randomtest.first_name like concat('%', dup.first_name, '%')) 
     ) 
    and dup.customer_id <> randomtest.customer_id) 
order by name 

私は、ORを追加などは他の方法で回避をチェックします。 クエリにlike文を使用するとパフォーマンスが低下することに注意してください。私はこれについて専門家ではなく、単なる考えです。

編集: 「マイナー - マイク」または「ウィリアム - >ビル」のようなケースをキャッチすることはありませんが、「短縮」バージョンが実際に部分文字列にすぎないケースをキャッチしますハンドジョンとJohnsonという名前の男は、2人の異なる人かもしれません。

+0

これはそれでした。後世のために、上記の質問に最終的な質問を追加します。 助けてくれてありがとう!これで私はかなり困惑しました。 – Charlie

+0

元の投稿にクエリを追加して読みやすくする必要があります。 @tsOverflow:同様のことだけでなく、ORもパフォーマンスに影響します。 –

+0

あなたの編集ごとに - この場合はそれが望ましいです。ユーザーには「可能な重複」のリストが提示され、それらの2つを比較した後に顧客データをマージすることを選択できます。 このソリューションは他のニーズに合わない可能性がありますが、これは私が必要としていたものです。再度、感謝します! – Charlie

関連する問題