使用LIKE在MySQL中查找重复记录

使用LIKE在MySQL中查找重复记录,sql,mysql,Sql,Mysql,我希望使用MySQL在customer表中按名称查找所有重复记录,包括那些不完全匹配的记录 我知道我可以使用这个查询 SELECT id, name FROM customer GROUP BY name HAVING count(*) > 1; 要查找完全匹配的所有行,但我要查找与LIKE子句匹配的所有重复行。例如,可能有一个名为“Mark's Widgets”的客户和另一个名为“Mark's Widgets Inc.”的客户。我希望我的查询能够找到重复的客户。因此,一些类似于 SEL

我希望使用MySQL在customer表中按名称查找所有重复记录,包括那些不完全匹配的记录

我知道我可以使用这个查询

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       |                |
 ...
编辑:为了澄清,我想找到所有重复的,而不仅仅是一个特定客户名称的重复

SELECT * FROM customer WHERE name LIKE "%Mark's Widgets%";
还应使用LIKE命令提供帮助


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

这样做是很有可能的,但在开始之前,您需要定义关于什么是匹配,什么不是匹配的规则,否则您将无法前往任何地方

例如,您可以忽略名称的前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

我认为这会起作用,但根据我的经验,在ONs中使用函数需要花费大量的时间来处理,特别是与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

这个怎么样。如果有区别的话,您可以用您的like替换a.name=b.name

Select a.id, b.id from customer a, customer b where a.name = b.name and a.id != b.id;
我的答案是

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

也许我不够清楚。我想找到所有的副本,而不仅仅是一个特定客户名称的副本。与示例中的第一个查询具有相同的效果,但使用LIKE。我认为一个好的开始是将一个名称作为另一个名称的子字符串。我一直在寻找的匹配类型是name1,比如%name2%,这里是MySQL语法:从客户t1左外部选择t1.ID,t1.name,在t1.name上加入客户t2,比如CONCAT(“%”,t2.name,“%”)组,通过t1.ID进行计数(*)>1;