0

我在 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))。

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

如何编写和 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;

非常感谢您的帮助。

4

2 回答 2

0

请考虑另一种方法:选择那些唯一的行并将它们插入到临时表中,然后删除旧行并重命名新行。这绕过了从您选择的表中删除的限制,并且更容易测试结果是否正确。

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

Note that if you have other columns that could have a different value in different rows (like the pdb), you should use an aggregate function (like min, max, sum, group_concat), or else the value that mysql will use for the new row will be undefined.

于 2011-10-02T18:40:19.217 回答
-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);
于 2011-10-02T17:31:18.453 回答