2012-04-09 2 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으로 돌아가 2 CUSTOMER_ID하는 쿼리가 필요합니다. 이 쿼리는 고객이 이름을 짧게했을 수도있는 곳, 리차드 대신 리치 (Rich) 또는 로버트 대신 롭 (Rob)을 검색해야합니다.

나는이 쿼리를 가지고 있지만 일치 항목 중 하나만 반환합니다 (둘 다 아님). 모두 Rich가 필요합니다. & 리처드가 쿼리에서 반환했습니다.

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 

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

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 

위의 솔루션은 성능 문제가있을 수 있습니다 :

당 @tsOverflow이 내 문제를 해결 최종 쿼리입니다.

+0

어떻게 MySQL이 'Richard'라는 이름을 'Rich'라는 이름으로 줄 이길 기대하십니까? –

+1

문제를 해결하려면 보조 정보가 필요합니다. 정보를 입력하는 사람에 따라 'Mike'= 'Mike'또는 'Mike'= 'Michael'과 'Jo'= 'Joseph'그리고 'Jo'= 'Joann'같은 메모를 얻을 수 있습니다. '리치 스미스'='리처드 스미스'? – 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 

내가 또는 추가 등이 다른 방법으로 주위를 확인하십시오

이 두 가지를 확인합니다. 쿼리에 like 문을 사용하면 성능에 문제가 있음을 유의하십시오.이 점에 대해서는 전문가가 아닙니다.

EDIT : 다른 사람들이 언급 한 것처럼 "단축"버전이 실제로는 부분 문자열 인 경우 만 잡아낼 수 있습니다. 마이클 -> 마이크 또는 윌리엄 - 빌과 같은 경우를 잡아낼 수 없습니다. 손 존과 존슨이라는 사람은 총 2 명이 될 수도 있습니다.

+0

이렇게했습니다. 후손을 위해 위 질문에 최종 쿼리를 추가하겠습니다. 도움 주셔서 감사합니다. 이것은 나를 꽤 난처하게했다. – Charlie

+0

원래 게시물에 업데이트를 추가하여 읽기 쉽게 만들어야합니다. @tsOverflow : 비슷한 것은 아니지만 OR이 성능에 영향을 미칩니다. –

+0

편집마다 -이 경우가 바람직합니다. 사용자는 "가능한 중복"목록을 표시하고 둘 중 하나를 비교 한 후 고객 데이터를 병합하도록 선택할 수 있습니다. 이 솔루션은 다른 요구 사항에 맞지 않을 수도있는 독특한 상황이지만 정확하게 필요한 것입니다. 다시 한 번 감사드립니다! – Charlie

관련 문제