我在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;
非常感谢你的帮助。
答案 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);