2013-06-04 90 views
0

我發現一個查詢抓取所有重複項並按列名對它們進行分組,但我需要顯示它自己的行上的每個記錄,按列名分組...查找同一列數據的重複

我所懷疑的是具有相同設計欄的多個記錄已上傳,我需要能夠比較每一行,以便確定哪些記錄是活動的。

下面的查詢好像它的工作,但每次我嘗試使用它的時候崩潰的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 

我需要所有的記錄顯示,不只是記錄可能是重複的。原因是,我需要能夠比較其餘的列,所以我可以知道哪些重複需要去。

+0

你是什麼意思「*每次崩潰mysql *」? MySQL段錯誤?如果是這樣,你應該檢查你使用的是穩定(GA)版本,如有必要升級,如果問題依然存在,請提交錯誤報告。 – eggyal

+0

500內部錯誤 – dcolumbus

+0

聽起來像一個httpd錯誤,而不是MySQL錯誤。 – eggyal

回答

0

您的查詢在邏輯上是正確的。但是,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 
      ) 
+0

500內部錯誤。你的例子有點令人困惑......並且它不會產生。 – dcolumbus

0

我覺得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不爲空。如果pc2_id爲空,則不會重複。否則,如果記錄重複超過2次,它會在您的結果中出現超過1次,是否有問題?

+0

這是實際給我的唯一一個查詢結果...但是,我需要顯示所有記錄,而不僅僅是可能重複的記錄。原因是,我需要能夠比較其餘的列,所以我可以知道哪些重複需要去。 – dcolumbus

+0

我已根據需要更新了查詢。 – Tarzan

+0

500內部錯誤。 – dcolumbus

0
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的記錄。

+0

這越來越接近了......但是我要找的每一行都在結果中,按照(在本例中)'sku'排序......我需要能夠看到每一行,以便我可以比較他們並刪除哪些重複未被使用。那有意義嗎? (ID)4,(SKU)1234 (ID)5,(SKU)1234 (ID)7,(SKU)4422 (ID)9,(SKU)4422 – dcolumbus

+0

僅僅通過子句通過訂購添加順序它應該已經選擇如 (4 1234),(51234),(74422),(94422)的每一行, –