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...

重複するエントリを削除したいのですが、そのうちの 1 つを残します。たとえば、最初の行を保持したいが、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

異なる行に異なる値を持つ可能性のある他の列 (pdb など) がある場合は、集計関数 (min、max、sum、group_concat など) を使用するか、mysql が新しい値に使用する値を使用する必要があることに注意してください。行は未定義になります。

于 2011-10-02T18:40:19.217 に答える
-1

私はあなたのためにそれを書いているわけではありませんが、その方法を説明します。最初に、削除するすべての ID (最初の列だと思いますよね?) を返す SELECT クエリを作成します。

次に、それらの ID を持つすべての行を削除する DELETE ステートメントを記述します。何かのようなもの:

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

つまり、最初に削除するすべての ID を取得してから、DBM にそれらの ID を削除するように指示します。それで全部です。

編集:可能なSQLを追加して、重複した行を1つだけ取得します。未検証。

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 に答える