使用LIKE在MySQL中查找重复记录
我希望使用MySQL在customer表中按名称查找所有重复记录,包括那些不完全匹配的记录 我知道我可以使用这个查询使用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
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;