删除表中的重复条目

Ekt*_*rma 3 mysql sql stored-procedures sql-delete

我想删除下表中的多个重复键:

id | name   | uid
1  | ekta   | 5
2  | ekta   | 5
3  | sharma | 10
4  | sharma | 10
Run Code Online (Sandbox Code Playgroud)

希望它像

id | name   | uid
1  | ekta   | 5
3  | sharma | 10
Run Code Online (Sandbox Code Playgroud)

我正在使用mysql.可能吗?我无法使用 unique constraint查询来创建唯一的输入,因为我希望将这些重复的条目输入到表中.

Joh*_*Woo 5

这样做的一种方法是使用子表连接表LEFT JOIN.子查询获得最低ID的每个UID.当记录在子查询上没有匹配时,只表示它没有匹配的记录,可以安全删除.

DELETE  a
FROM    TableName a
        LEFT JOIN
        (
            SELECT  uid, MIN(ID) min_ID
            FROM    TableName
            GROUP   BY uid
        ) b ON  a.uid = b.uid AND
                a.ID = b.min_ID
WHERE   b.uid IS NULL
Run Code Online (Sandbox Code Playgroud)

但是,如果记录中UID可以有不同的名称,那么您需要namegroup by子句中包含或者只保留uid最低的唯一记录ID.

DELETE  a
FROM    TableName a
        LEFT JOIN
        (
            SELECT  uid, MIN(ID) min_ID, name
            FROM    TableName
            GROUP   BY uid, name
        ) b ON  a.uid = b.uid AND
                a.ID = b.min_ID AND
                a.name = b.name
WHERE   b.uid IS NULL
Run Code Online (Sandbox Code Playgroud)