有人可以幫我寫一個sql select來執行任務。 所以問題是我們有一張桌子,並且有一些重複的東西,所以我需要找到名稱,街道和房屋是相同的,並以某種方式將它們分組。Mysql選擇查找重複項
我幾乎有this的情況,但不同的是,我想將它們分組以找出什麼是重複的。
在此先感謝。
有人可以幫我寫一個sql select來執行任務。 所以問題是我們有一張桌子,並且有一些重複的東西,所以我需要找到名稱,街道和房屋是相同的,並以某種方式將它們分組。Mysql選擇查找重複項
我幾乎有this的情況,但不同的是,我想將它們分組以找出什麼是重複的。
在此先感謝。
這是假設你有一個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)
要獲取重複項,只需在表上使用自連接:
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將確保每個副本只會出現一次。
+1解決方案,但我需要使其可以過濾它們,客戶端將刪除它們,所以我必須顯示所有這些。 – Centurion 2010-08-17 10:59:06
完美,謝謝丹尼爾。如果你不介意我會問如何使這裏可能得到其他列不重複,因爲我需要他們在網格中顯示?.. 我想我們必須再次更改查詢.. – Centurion 2010-08-17 11:55:39
@ Vadim:除非您在這些列上再次使用「GROUP_CONCAT()」,否則無法以此格式顯示其他列。想象一下,在上面的例子中,我們有另一個名爲「value」的列,第1行的值爲100,第2行的值爲200等。現在,由於我們將最終結果集分組以顯示行那些有重複的東西,應該在'value'列中有什麼? 100,400或500? (因爲所有這3條記錄都分成一行)......但是我們可以使用'GROUP_CONCAT(value)'將這個列作爲一個逗號分隔的字段,就像'dupes'列一樣。 – 2010-08-17 12:10:56
@Vadim:...另一方面,您可能想嘗試下面的@wimvds解決方案,它應該在單獨的行中顯示所有重複的記錄。 – 2010-08-17 12:11:33