2013-09-30 106 views
0

我有一個情況, 我的MySQL表(公司)包含重複的記錄,即它有重複的公司,有些記錄在大多數列中有值,有些沒有。所以我想刪除那些擁有最少信息的重複公司。夥計們有什麼想法?如何刪除具有最少信息集的重複行?

Id Company_name column column2 column3 column4  
------------------------------------------------- 
1 A     xyz 
2 B   pqr abc  tcv aaa 
3 A   bnm xyz  ccc  
4 A   bnm xyz   
5 B         aaa 

我需要讓我的表如下

Id Company_name column column2 column3 column4  
-------------------------------------------------  
2 B   pqr abc  tcv aaa 
3 A   bnm xyz  ccc  
+0

向我提供更多信息,比如哪些列可以有重複值 – Sudharsun

+0

每個列都可以有重複的值,我只需要保留一個記錄,其中最大數量的列中有值。 – nu6A

+0

如果你發現一個非常好的算法,魅力,你只賺了一百萬美元。這是最簡單的任務之一,最簡單的方法是首先執行嚴格的數據輸入,但您現在可能知道... – Fluffeh

回答

2

你可以有一個PHP的方法來做好這項工作,並手動您將要減少重複行什麼檢索由列分組中的所有記錄。在上述情況下,您正在考慮Company_name列。但有可能在其他列上有不同的值,但不在Company_name列中。這可能會在理解算法如何處理這種類型的行時產生歧義。
但是,在插入值之前,必須檢查信息以避免重複出現。但是,如果你已經有這樣的記錄,下面的查詢可能會有所幫助。

DELETE FROM TABLENAME WHERE (Company_name, column) 
NOT IN 
(
    SELECT Company_name, column FROM 
    (
    SELECT MIN(Id) AS Id, column FROM TABLENAME GROUP BY Company_name 
) 
    X 
); 

這是爲了刪除一列的重複值,可以使用多個查詢的組合來減少重複值。

+0

謝謝@Ritesh,我也會檢查這個 – nu6A

1

很可能得到一個每一行的「分數」和底座上的決定。這是一個快速示例,顯示從哪裏開始。

SELECT id, 
     name, 
     length(concat_ws('', col1, col2, col3, col4)) AS score 
    FROM company 
ORDER BY score DESC; 

看到它在sqlfiddle

+0

謝謝@andreas,我將檢查這個 – nu6A

+1

你應該可能有另一個函數比concat_ws和長度,也許是一個isnull(col1)的總和等等,但你明白了, –