2010-08-17 85 views
3

有人可以幫我寫一個sql select來執行任務。 所以問題是我們有一張桌子,並且有一些重複的東西,所以我需要找到名稱,街道和房屋是相同的,並以某種方式將它們分組。Mysql選擇查找重複項

我幾乎有this的情況,但不同的是,我想將它們分組以找出什麼是重複的。

在此先感謝。

回答

9

這是假設你有一個id場,將與GROUP_CONCAT()功能進行分組每個重複行:

SELECT t1.name, t1.street, t1.house, GROUP_CONCAT(DISTINCT t1.id) dupes 
FROM  your_table t1 
JOIN  your_table t2 ON (t2.name = t1.name AND 
          t2.street = t1.street AND 
          t2.house = t1.house) 
GROUP BY t1.name, t1.street, t1.house 
HAVING COUNT(*) > 1; 

測試用例:

CREATE TABLE your_table (
    id int, 
    name varchar(10), 
    street varchar(10), 
    house varchar(10) 
); 

INSERT INTO your_table VALUES (1, 'a', 'b', 'c'); 
INSERT INTO your_table VALUES (2, 'a', '1', 'c'); 
INSERT INTO your_table VALUES (3, 'a', '2', '3'); 
INSERT INTO your_table VALUES (4, 'a', 'b', 'c'); 
INSERT INTO your_table VALUES (5, 'a', 'b', 'c'); 
INSERT INTO your_table VALUES (6, 'c', 'd', 'e'); 
INSERT INTO your_table VALUES (7, 'c', 'd', 'e'); 

結果:

+------+--------+-------+-------+ 
| name | street | house | dupes | 
+------+--------+-------+-------+ 
| a | b  | c  | 1,5,4 | 
| c | d  | e  | 6,7 | 
+------+--------+-------+-------+ 
2 rows in set (0.03 sec) 
+0

完美,謝謝丹尼爾。如果你不介意我會問如何使這裏可能得到其他列不重複,因爲我需要他們在網格中顯示?.. 我想我們必須再次更改查詢.. – Centurion 2010-08-17 11:55:39

+0

@ Vadim:除非您在這些列上再次使用「GROUP_CONCAT()」,否則無法以此格式顯示其他列。想象一下,在上面的例子中,我們有另一個名爲「value」的列,第1行的值爲100,第2行的值爲200等。現在,由於我們將最終結果集分組以顯示行那些有重複的東西,應該在'value'列中有什麼? 100,400或500? (因爲所有這3條記錄都分成一行)......但是我們可以使用'GROUP_CONCAT(value)'將這個列作爲一個逗號分隔的字段,就像'dupes'列一樣。 – 2010-08-17 12:10:56

+0

@Vadim:...另一方面,您可能想嘗試下面的@wimvds解決方案,它應該在單獨的行中顯示所有重複的記錄。 – 2010-08-17 12:11:33

2

要獲取重複項,只需在表上使用自連接:

select t1.id, t2.id, t1.name, t1.street, t1.house 
from table t1 
inner join table t2 on t1.name=t2.name and t1.street=t2.street and t1.house=t2.house 
where t1.id < t2.id 

t1.id < t2.id將確保每個副本只會出現一次。

+0

+1解決方案,但我需要使其可以過濾它們,客戶端將刪除它們,所以我必須顯示所有這些。 – Centurion 2010-08-17 10:59:06