Удаление избыточных данных из MySQL - PullRequest
0 голосов
/ 02 октября 2011

У меня есть таблица в 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 и col3 (1w18 B-E), имеющие одинаковое значение col4 (SACB-ACEDI).

Как я могу написать и 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 голосов
/ 02 октября 2011

Вместо этого рассмотрите альтернативный маршрут: выберите эти уникальные строки и вставьте их во временную таблицу, затем отбросьте старую и переименуйте новую. Это позволяет обойти ограничения на удаление из выбранной таблицы и значительно облегчить проверку правильности результатов.

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

Обратите внимание, что если у вас есть другие столбцы, которые могут иметь другое значение в разных строках (например, pdb), вы должны использовать агрегатную функцию (например, min, max, sum, group_concat), или же значение, которое будет использовать mysql для новой строки будет неопределено.

0 голосов
/ 02 октября 2011

Я не пишу это для вас, но я расскажу, как это сделать. Сначала напишите запрос SELECT, который вернет все идентификаторы (я полагаю, это первый столбец, верно?), Который вы хотите удалить.

Затем напишите оператор DELETE, который удалит все строки с этими идентификаторами. Что-то вроде:

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

Итак, вкратце, вы сначала получаете все идентификаторы, которые хотите удалить, а затем говорите DBM удалить эти идентификаторы. Вот и все.

EDIT: Просто добавьте возможный SQL, чтобы получить все дублированные строки, кроме одной. Не проверено.

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