2010-02-12 115 views
4

我想在使用MySQL的客户表中查找所有重复的记录名称,包括那些不完全匹配的记录。在MySQL中使用LIKE查找重复记录

我知道我可以使用查询

SELECT id, name FROM customer GROUP BY name HAVING count(*) > 1; 

找到完全匹配的所有行,但我想找到一个LIKE语句匹配所有重复行。例如,可能有一个名为“Mark's Widgets”的顾客和另一个“Mark's Widgets Inc.”我想我的查询找到这些重复。所以沿线

SELECT id, name AS name1 ... WHERE name1 LIKE CONCAT("%", name2, "%") ... 

我知道这是完全不正确的,但这就是主意。这里是能够架构:

mysql> describe customer; 
+-----------------------------+--------------+------+-----+------------+----------------+ 
| Field      | Type   | Null | Key | Default | Extra   | 
+-----------------------------+--------------+------+-----+------------+----------------+ 
| id       | int(11)  | NO | PRI | NULL  | auto_increment | 
| name      | varchar(140) | NO |  | NULL  |    | 
... 

编辑:为了澄清,我想找到所有重复,不只是一个具体的客户名称的副本。

回答

3

这是完全可能的,但在开始之前,您需要定义关于什么是匹配和什么不匹配的规则,没有你不能去任何地方。例如,你可以忽略名字的第一个和最后3个字符并匹配中间字符,或者你可以选择更复杂的逻辑,但是没有实现你想要的东西的神奇方法,你将会拥有编码逻辑。无论您选择什么,在开始之前以及在我们能够真正帮助您之前,都需要对其进行定义。

没有mysql这里,所以原谅了语法错误(它的T-SQL语法,如果有的话),但我想自连接

SELECT 
    t1.ID 
FROM MyTable t1 
LEFT OUTER JOIN MyTable t2 
ON t1.name LIKE CONCAT('%', t2.name, '%') 
group by t1.ID 
HAVING count(*) > 1 
+0

我认为一个好的开始是一个名字是另一个子字符串。我在寻找的匹配类型是name1 LIKE%name2% – markb 2010-02-12 23:38:48

+0

@markb,好的,我编辑了一个可能的解决方案。 – 2010-02-12 23:57:02

+1

以下是MySQL语法:SELECT t1.ID,t1.name FROM customer t1 LEFT OUTER JOIN customer t2 ON t1.name LIKE CONCAT('%',t2.name,'%')group by t1.ID HAVING count( *)> 1; – markb 2010-02-15 15:54:49

-1
SELECT * FROM customer WHERE name LIKE "%Mark's Widgets%"; 

http://www.mysqltutorial.org/sql-like-mysql.aspx也应该帮助LIKE命令。

不知道为什么你需要使用CONCAT部分,所以这可能太简单了。

+0

也许我还不够清楚。我想查找所有重复项目,而不仅仅是一个特定客户名称的重复项目。与示例中的第一个查询具有相同的效果,但使用LIKE。 – markb 2010-02-12 23:34:35

0

我认为这会工作,但我的经验,其内部功能ON需要花费大量的时间来处理,特别是与LIKE操作符结合使用。尽管如此,它比交叉连接稍微好一些。

SELECT 
cust1.id, 
cust1.name 
FROM 
customer AS cust1 
INNER JOIN customer AS cust2 ON 
(cust1.name LIKE (CONCAT('%',CONCAT(cust2.name,'%')))) 
GROUP BY 
cust1.id, 
cust1.name 
HAVING 
count(*) > 1 
0

这个怎么样。你可以用你的喜欢替换a.name = b.name,如果这有所作为。

Select a.id, b.id from customer a, customer b where a.name = b.name and a.id != b.id; 
0

我的答案是...

SELECT A . * 
FROM customer AS A, customer AS B 
WHERE A.name LIKE CONCAT('%', B.name, '%') 
AND A.name = B.name 
GROUP BY A.id 
HAVING COUNT(*) >1