2010-02-12 124 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