[英]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
)
我認為IN
或exists
語句的性能非常高。
假設您的表有一個名為
的字段作為您的主鍵。 記住在您的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.