簡體   English   中英

查找相同列數據的重復項

[英]Finding duplicates of the same column data

我找到了一個查詢,該查詢可捕獲所有重復項並按列名將它們分組,但是我需要在其自己的行上顯示每個記錄,並按列名分組...

我懷疑的是,上載具有相同設計列的多個記錄,並且我需要能夠比較每一行,以便確定哪些行處於活動狀態。

下面的查詢似乎可以正常工作,但是每次嘗試使用它時,mysql都會崩潰:

SELECT *
FROM 2009_product_catalog
WHERE sku IN (
    SELECT sku
    FROM 2009_product_catalog
    GROUP BY sku
    HAVING count(sku) > 1
    )
ORDER BY sku

我需要顯示所有記錄,而不僅僅是可能重復的記錄。 原因是,我需要能夠比較其余的列,這樣我才能知道需要重復哪些內容。

您的查詢在邏輯上是正確的。 但是,MySQL in使用子查詢進行優化方面存在一些問題。 試試這個版本:

SELECT pc.*
FROM 2009_product_catalog pc join
     (SELECT sku
      FROM 2009_product_catalog
      GROUP BY sku
      HAVING count(sku) > 1
     ) pcsum
     on pcsum.sku = pc.sku
ORDER BY sku;

如果仍然不能解決問題,請確保在2009_product_catalog(sku, pcid)上有一個索引(其中pcid是表中每一行的唯一ID。然后嘗試執行以下操作:

select pc.*
FROM 2009_product_catalog pc
where exists (select 1
              from 2009_product_catalog pc2
              where pc2.sku = pc.sku and pc2.pcid <> pc.pcid
             )

我認為INexists語句的性能非常高。

假設您的表有一個名為id的字段作為您的主鍵。 記住在您的sku字段上創建一個索引。


SELECT pc.*
FROM 
    2009_product_catalog pc
        INNER JOIN 2009_product_catalog pc2 ON pc.sku = pc2.sku AND pc.id != pc2.id

編輯


SELECT pc.*, pc2.id as `pc2_id`
FROM 
    2009_product_catalog pc
        LEFT OUTER JOIN 2009_product_catalog pc2 ON pc.sku = pc2.sku AND pc.id != pc2.id

此查詢為您提供所有記錄,每個重復的記錄的pc2_id不為null。 如果pc2_id為null,則不會重復。 否則,如果記錄重復2次以上,它將在您的結果中出現1次以上,這有問題嗎?

SELECT * FROM 2009_product_catalog t1 INNER JOIN
( SELECT sku FROM 2009_product_catalog GROUP BY sku HAVING COUNT(sku) > 1 ) t2
ON t1.sku = t2.sku

這是您的問題中發布的原始查詢的替代方法。 它使用聯接而不是子查詢,因此聯接更快。

t1是原始表。 t2僅包含重復的行。 結果(內部聯接)將具有重復的sku記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM