Удаление повторяющихся значений из таблицы MySQL, но оставить один - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь удалить повторяющиеся строки из таблицы mysql, но все еще сохраняю одну.Однако следующий запрос, по-видимому, удаляет все повторяющиеся строки, и я не уверен, почему.В основном я хочу удалить строку, если outputID, title и type все совпадают.

DELETE DupRows.*
FROM output AS DupRows
INNER JOIN (
    SELECT MIN(Output_ID) AS Output_ID, Title, Type
    FROM output
    GROUP BY Title, Type
    HAVING COUNT(*) > 1
) AS SaveRows 
    ON  SaveRows.Title = DupRows.Title 
    AND SaveRows.Type = DupRows.Type
    AND SaveRows.Output_ID = DupRows.Output_ID;

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019
Delete From output  Where Output_ID NOT IN (
Select MIN(Output_ID) from output  Group By Title, Type  Having COUNT(*)>1
)
0 голосов
/ 12 февраля 2019

По запросу ниже дублирующиеся строки с соответствующим условием удаляются и сохраняются одна самая старая уникальная строка.

ПРИМЕЧАНИЕ: - В моем запросе я использовал id column - столбец с автоинкрементом.

DELETE t1
FROM output  t1, output  t2
WHERE t1.Title  = t2.Title
AND  t1.Type   = t2.Type 
AND t1.Output_ID   = t2.Output_ID 
AND t1.id>t2.id

Если вы хотите сохранить вновь вставленную уникальную строку, просто измените последнее условие следующим образом:

DELETE t1
 FROM output  t1, output  t2
 WHERE t1.Title  = t2.Title
 AND  t1.Type   = t2.Type 
 AND t1.Output_ID   = t2.Output_ID 
 AND t1.id<t2.id
0 голосов
/ 12 февраля 2019

Just:

DELETE DupRows
FROM output AS DupRows
INNER JOIN output AS SaveRows
    ON  SaveRows.Title = DupRows.Title 
    AND SaveRows.Type = DupRows.Type  
    AND DupRows.Output_ID > SaveRows.Output_ID

Это удалит все дубликаты на Title и Type, сохраняя запись с самым низким значением.

Если вы используете MySQL 8.0, выможет использовать оконную функцию ROW_NUMBER() для присвоения ранга каждой записи в группах заголовков / типов, упорядоченных по идентификатору.Затем вы можете удалить все записи, чей номер строки не равен 1.

DELETE FROM output
WHERE Output_ID IN (
    SELECT Output_ID
    FROM (
        SELECT Output_ID, ROW_NUMBER() OVER(PARTITION BY Title, Type ORDER BY Output_ID) rn
        FROM output
    ) x
    WHERE rn > 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...