首页 > 解决方案 > 从mysql表中删除重复值但保留一个

问题描述

我正在尝试从 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;

标签: mysqlsql

解决方案


只是 :

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

这将删除所有重复项TitleType同时保留最低值的记录。

如果您正在运行 MySQL 8.0,您可以使用窗口函数ROW_NUMBER()为 Title/Type 组中的每条记录分配一个排名,按 id 排序。然后你可以删除所有行号不为 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
)

推荐阅读