2017-10-16 60 views
1

我想通過一張擁有數千條記錄的表格進行篩選,並且需要獲得真正的重複行。通過真我的意思是所有列是相同的記錄。MySQL,獲取真實重複記錄

我使用像這樣的時刻,但它顯然只是找到COLUMN_1重複:

SELECT * FROM `table` 
    WHERE `column_1` IN (
     SELECT `column_1` FROM `table` 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 
    ) 

我怎麼會寫這樣獲得與被複制的所有列排除的ID重複的行? 沒有列出表格中的所有列?

+0

在MySQL中,我認爲你必須列出所有的列。 –

回答

1

,這很容易使您的查詢工作,爲所有列,假設無有NULL值:

SELECT t.* 
FROM `table` t 
WHERE (`column_1`, `column_2`, `column_3`) IN (
     SELECT `column_1`, `column_2`, `column_3` 
     FROM `table` t2 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 
    ); 

如果你有NULL值,那麼你要NULL安全比較:

SELECT t.* 
FROM `table` t JOIN 
     (SELECT `column_1`, `column_2`, `column_3` 
     FROM `table` t2 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 
    ) tt 
     ON (NOT tt.column_1 <=> t.column_1) AND 
     (NOT tt.column_2 <=> t.column_2) AND 
     (NOT tt.column_3 <=> t.column_3); 

當然,這遠離簡單的目標。

爲什麼你需要看到每個重複是好奇。爲什麼不這樣做:

 SELECT `column_1`, `column_2`, `column_3`, COUNT(*) 
     FROM `table` t2 
     GROUP BY `column_1`, `column_2`, `column_3` 
     HAVING COUNT(id) > 1 

儘管在這兩種情況下,您都需要列出所有列(至少一次)。否則,我認爲在MySQL中沒有辦法做到這一點。有些數據庫允許您爲整行創建一個JSON對象或XML對象 - 使其成爲可能而不列出所有列。我想不出任何類似於MySQL的東西。

+0

我玩過這個確切的想法,,,這不是我所需要的。一些肯定有空值。我沒有顯示所有列的問題,我檢索絕對副本時遇到問題。我需要看到它們,因爲它們必須可用於客戶端的視覺概覽。你可能是對的,但我必須至少列出一次:) – GRowing

+0

謝謝你。經過一些修改後,它會正常工作 – GRowing