我正试图在表格中找到重复的客户:
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
上述解决方案可能存在性能问题。
答案 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;比尔,另一方面,约翰和一些名叫约翰逊的人也可能是两个完全不同的人。