2013-05-01 41 views
20

我希望從表中選擇記錄,或將它們插入到一個新的空白表中,其中多個列與數據庫中的另一個記錄相同。問題類似於這個問題。 Find duplicate records in MySQL 但是,只比較一列。另外,我的其中一列,可以說下面的例子中的列C是一個整數。像上面鏈接中的問題一樣,我希望每個行都被返回。不幸的是,我只是不太熟悉加入如何自行解決這個問題。我知道下面的代碼根本不符合實際的SQL代碼需求,它只是我能想到的描述我試圖獲得的比較的最清晰的方式。MySQL選擇使用多列的副本的記錄

SELECT ColumnE, ColumnA, ColumnB, ColumnC from table where (
    Row1.ColumnA = Row2.ColumnA && 
    Row1.ColumnB = Row2.ColumnB && 
    Row1.ColumnC = Row2.ColumnC 
) 

任何幫助將不勝感激,所有「選擇從MYSQL重複」的問題,我看到只用一列作爲比較。

回答

46

如果你要計算多列中重複使用group by

select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates 
from table 
group by ColumnA, ColumnB, ColumnC 

如果僅想是重複的值,那麼計數大於1大你該使用having條款得到:

select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates 
from table 
group by ColumnA, ColumnB, ColumnC 
having NumDuplicates > 1 

如果你真的希望所有的重複的行返回,然後加入最後的查詢返回到原始數據:

select t.* 
from table t join 
    (select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates 
     from table 
     group by ColumnA, ColumnB, ColumnC 
     having NumDuplicates > 1 
    ) tsum 
    on t.ColumnA = tsum.ColumnA and t.ColumnB = tsum.ColumnB and t.ColumnC = tsum.ColumnC 

這將工作,假設列值都不爲NULL。如果是,請嘗試:

 on (t.ColumnA = tsum.ColumnA or t.ColumnA is null and tsum.ColumnA is null) and 
     (t.ColumnB = tsum.ColumnB or t.ColumnB is null and tsum.ColumnB is null) and 
     (t.ColumnC = tsum.ColumnC or t.ColumnC is null and tsum.ColumnC is null) 
+3

Excellant答案,像往常一樣,但最後一個例子可以使用MySQL的「空安全」被改寫等於操作:'對t.ColumnA <=> tsum.ColumnA和t.ColumnB <=> tsum.ColumnB和t.ColumnC <=> tsum.ColumnC' – 2013-05-01 23:15:24

+3

這個答案似乎工作,但返回的數量是比我期望的很多不同。可能必須編寫一些用於循環的java來仔細檢查它並給我一些想法。非常感謝您以這種方式格式化您的SQL代碼,使用新行和縮進,它確實幫助我理解您的代碼實際上在做什麼! – keepitreall89 2013-05-02 01:49:29

1

爲什麼不嘗試使用聯合或創建臨時表。但個人而言,我建議使用union而不是創建臨時表,因爲這會花費更長的時間。嘗試這樣做:

select field1, field2 from(
    select '' as field2, field1, count(field1) as cnt FROM list GROUP BY field2 HAVING cnt > 1 
    union 
    select ''as field1, field2, cound(field2) as cnt from list group by field1 having cnt > 1 
) 

希望這有意義:)