使用LIKE搜索重复的客户

时间:2012-04-09 20:15:05

标签: mysql mysqli

我正试图在表格中找到重复的客户:

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而不是Richard - 或Rob而不是Robert。

我有这个查询,但它只返回一个(不是两个)匹配。我需要Rich和amp;理查德回答了这个问题。

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

上述解决方案可能存在性能问题。

1 个答案:

答案 0 :(得分:1)

你的问题是因为Rich是Richard的子串,但不是相反。

这将检查两种方式:

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语句会产生性能影响 - 我不是这方面的专家,只是一个想法。

编辑: 正如其他人在评论中所提到的 - 这只会抓住“缩短”版本实际上只是一个子串的情况,它不会遇到迈克尔 - &gt;迈克,或威廉 - &gt;比尔,另一方面,约翰和一些名叫约翰逊的人也可能是两个完全不同的人。