2009-10-15 76 views
2

假設我有很多列。如果2列匹配並且完全相同,那麼它們是重複的。如何在MySQL中找到重複項

ID | title | link | size | author 

假設如果鏈接和大小類似2行或更多,那麼這些行是重複的。 如何將這些副本放入列表並處理它們?

+0

那你試試? – SilentGhost 2009-10-15 18:04:06

回答

7

會傳回的DUP所有記錄:

SELECT theTable.* 
FROM theTable 
INNER JOIN (
    SELECT link, size 
    FROM theTable 
    GROUP BY link, size 
    HAVING count(ID) > 1 
) dups ON theTable.link = dups.link AND theTable.size = dups.size 

我喜歡的子查詢B/C我可以做的事情一樣選擇所有,但第一個或最後。 (然後很容易變成刪除查詢)。

實例:選擇所有重複的記錄,除了一個與所述最大ID:

SELECT theTable.* 
FROM theTable 
INNER JOIN (
    SELECT link, size, max(ID) as maxID 
    FROM theTable 
    GROUP BY link, size 
    HAVING count(ID) > 1 
) dups ON theTable.link = dups.link 
      AND theTable.size = dups.size 
      AND theTable.ID <> dups.maxID 
1

假設無ID鏈路尺寸可以是NULL,和ID字段是主鍵。這給你的重複行的ID。如果有三個或更多的行具有相同的鏈接和大小值,請注意可以多次在結果中包含相同的ID。

select a.id, b.id 
from tbl a, tbl b 
where a.id < b.id 
    and a.link = b.link 
    and a.size = b.size 
0

如果你想專門做它在SQL,某種類型的表(上linksize平等)是必需的自連接,並且可以由各種不同的闡述陪同。既然你也提到Python,我假設你想用Python來處理;在這種情況下,最簡單的方法是在'SELECT * FROM thetable ORDER BY'鏈接上創建一個迭代器,大小爲, and process with itertools.groupby using, as key, the operator.itemgetter`這兩個字段;這將呈現每個1+行的每個串的自然分組,其具有相同的值,用於所討論的字段。

如果您澄清要執行處理的位置並理想地提供您想要執行的處理類型的示例,那麼我可以詳細說明這兩個選項之一!

+1

我想根據某些屬性找到「重複」的行。然後我想計算「重要」行,並刪除/更新「重複」行的分數! 哇,你寫了Python食譜!!!我現在就在我的桌面上 – TIMEX 2009-10-15 18:33:25

1

後您從MySQL表中刪除重複的,你可以添加一個唯一索引 至所以沒有更多的副本可以插入表:

create unique index theTable_index on theTable (link,size);