2013-09-30 104 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)的总和等等,但你明白了, –