从mysql中删除冗余数据

时间:2011-10-02 17:15:57

标签: mysql redundancy

我在sql中有一个表格,如:

        1   1w10    U   UROK_HUMAN  IIGGEFTTIENQPWFAAIYRRHRGGSVTYVCGGSLISPCWVISATHCFID...   
        2   1w11    U   UROK_HUMAN  IIGGEFTTIENQPWFAAIYRRHRGGSVTYVCGGSLISPCWVISATHCFID...   
        3   1w12    U   UROK_HUMAN  IIGGEFTTIENQPWFAAIYRRHRGGSVTYVCGGSLISPCWVISATHCFID...   
        4   1w13    U   UROK_HUMAN  IIGGEFTTIENQPWFAAIYRRHRGGSVTYVCGGSLISPCWVISATHCFID...   
        5   1w14    U   UROK_HUMAN  IIGGEFTTIENQPWFAAIYRRHRGGSVTYVCGGSLISPCWVISATHCFID...
        6   1w15    A   SYT4_RAT    GSPGISGGGGGIPSGRGELLVSLCYQSTTNTLTVVVLKARHLPKSDVSGL...   
        7   1w16    A   SYT4_RAT    GSPGISGGGGGIPSGRGELLVSLCYQSTTNTLTVVVLKARHLPKSDVSGL...   
        8   1w17    B   PDAA_BACSU  MKWMCSICCAAVLLAGGAAQAEAVPNEPINWGFKRSVNHQPPDAGKQLNS...   
        10  1w18    B   SACB_ACEDI  AGVPGFPLPSIHTQQAYDPQSDFTARWTRADALQIKAHSDATVAAGQNSL...   
        12  1w18    E   SACB_ACEDI  MKGGAGVPDLPSLDASGVRLAIVASSWHGKICDALLDGARKVAAGCGLDD...

我想删除重复的条目,但留下其中一个。例如,我想保留第一行但删除2,3,4,5。简而言之,我想删除具有相同列4值的行(此处为UROK-HUMAN)但具有不同的col2和col3值(此处为1w10,1w11等(col2)和U,A,B(col3))。

但是,我不想删除具有相同col2值(SACB-ACEDI)的col2和col3(1w18 B-E)相同的条目。

如何编写和删除这些行的sql语句?我试着写出来并且不起作用:

SELECT pdb, chain, unp, sekans, COUNT(*) AS ct
FROM protein
JOIN (SELECT DISTINCT(unp)
          FROM protein 
          GROUP by pdb) protein2 ON protein2.unp = protein.unp;

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

考虑替代路线:选择那些唯一的行并将它们插入临时表,然后删除旧的并重命名新的行。这避免了从您选择的表中删除的限制,这使得测试结果更加容易。

INSERT INTO newtable SELECT min(pdb), chain, unp, sekans
FROM protein
GROUP by chain, unp, sekans

请注意,如果您有其他列可能在不同的行(如pdb)中具有不同的值,则应使用聚合函数(如min,max,sum,group_concat),否则mysql将使用的值对于新行将是未定义的。

答案 1 :(得分:-1)

我不是为你写的,但我会告诉你该怎么做。首先编写一个SELECT查询,它将返回你要删除的所有ID(我想这是第一列,对吧?)。

然后编写DELETE语句,删除具有这些ID的所有行。类似的东西:

DELETE from protein where pdb in
(SELECT pdb from protein #here_goes_the_query_im_not_writing#)

因此,简而言之,您首先获取要删除的所有ID,然后告诉DBM删除这些ID。就是这样。

编辑:只需添加一个可能的SQL即可获得所有重复的行,但只需一个。未经测试。

SELECT pdb FROM protein WHERE
pdb not in (
    SELECT pdb FROM (
        SELECT sekans, pdb FROM protein
        GROUP BY sekans)
    as T);