2013-06-28 26 views
0

我試圖通過大表中的幾列(接近18 000行)搜索重複的行。問題是,查詢需要大量的時間,我想這一點:在MySQL中通過幾列獲取重複的行

SELECT * FROM table_name a, table_name b 
WHERE a.col1 = b.col1 
AND a.col2 = b.col2 
AND a.col3 = b.col3 
AND a.col4 = b.col4 
AND a.id <> b.id 

這:

SELECT * 
FROM table_name 
WHERE col1 IN (
    SELECT col1 
    FROM table_name 
    GROUP BY col1 
    HAVING count(col1) > 1 
    ) 
AND col2 IN (
    SELECT col2 
    FROM table_name 
    GROUP BY col2 
    HAVING count(col2) > 1 
    ) 
AND col3 IN (
    SELECT col3 
    FROM table_name 
    GROUP BY col3 
    HAVING count(col3) > 1 
    ) 
AND col4 IN (
    SELECT col4 
    FROM table_name 
    GROUP BY col4 
    HAVING count(col4) > 1 
    ) 

他們都工作,但是太慢了。有任何想法嗎?

+0

我不明白爲什麼Siphon的'count by> 1'嘗試不適合你。你能發佈樣本數據和期望的結果嗎? – fancyPants

+0

他想要返回每一行。小組將會給你一個重複的,但不是其他相同的行。所以如果4行被分組在一起,那麼只有1個會被分組返回。這不適用於所有人,至少不適合他。 – Siphon

回答

1

您可以嘗試使用一個聯合GROUP BY語句,如:

SELECT * FROM table_name 
    GROUP BY col1, col2, col3, col4 
    HAVING count(*) > 1 

最起碼,它看起來更清潔。

編輯

要返回所有結果的子集爲前柱:

SELECT * 
FROM table_name 
WHERE col4 IN (
    SELECT col4 
    FROM table_name 
    WHERE col3 IN (
    SELECT col3 
    FROM table_name 
    WHERE col2 IN (
     SELECT col2 
     FROM table_name 
     WHERE col1 IN (
     SELECT col1 
     FROM table_name 
     GROUP BY col1 
     HAVING count(col1) > 1 
     ) 
    ) 
    )

這在概念上,應該給你一個更快的執行時間,所有結果。

+0

感謝您的回答,但它不能解決我的任務。我需要那些重複的東西,但不要將它們分組。 – GoldenTabby

+0

我的錯誤。這聽起來像你想看到如果有重複,而不是返回所有結果。 – Siphon

+0

我唯一的建議是使用子查詢,在匹配列時減少總體結果。因此,匹配col1,然後匹配col1的結果中的col2。這將防止需要匹配每列的所有18000行。 – Siphon