Mysql 如何使用group by删除重复的值

Mysql 如何使用group by删除重复的值,mysql,Mysql,示例数据库: ID StudentName StudentClass 1 John A 2 John B 3 Peter A 4 John A 5 John B 我想结果应该是 ID StudentName StudentClass 1 John A 2 John B 3 Peter A 固定 DELETE FROM Student WHERE ID NOT IN (

示例数据库:

ID StudentName StudentClass
1  John        A
2  John        B
3  Peter       A
4  John        A
5  John        B
我想结果应该是

ID StudentName StudentClass
1  John        A
2  John        B
3  Peter       A
固定

DELETE FROM Student
 WHERE ID NOT IN (SELECT * 
                    FROM (SELECT MIN(n.ID)
                            FROM Student n
                        GROUP BY n.StudentName) x)

如何在类A&B上保留John的名字?

您应该能够针对自身加入
学生
,使用连接谓词确保连接匹配重复的学生,并删除连接行:

DELETE 
  duplicate_students.* 
FROM Students JOIN Students as duplicate_students 
  ON Students.StudentName = duplicate_students.StudentName
  AND Students.StudentClass = duplicate_students.StudentClass
  AND duplicate_students.ID > Students.ID

注意:请先备份您的数据;我对丢失的数据不承担任何责任:-)这是一个概念性的想法,尚未经过测试

您应该能够针对自身加入
Students
,使用一个连接谓词确保连接匹配重复的Students,并删除连接行:

DELETE 
  duplicate_students.* 
FROM Students JOIN Students as duplicate_students 
  ON Students.StudentName = duplicate_students.StudentName
  AND Students.StudentClass = duplicate_students.StudentClass
  AND duplicate_students.ID > Students.ID
DELETE a FROM Student a
LEFT JOIN
    (
        SELECT MIN(ID) AS minid
        FROM Student
        GROUP BY StudentName, StudentClass
    ) b ON a.id = b.minid
WHERE
    b.minid IS NULL

注意:请先备份您的数据;我对丢失的数据不承担任何责任:-)这是一个概念性的想法,尚未经过测试

一种更好的方法是多列唯一索引(它也将优化您的搜索)。以下是如何:

DELETE a FROM Student a
LEFT JOIN
    (
        SELECT MIN(ID) AS minid
        FROM Student
        GROUP BY StudentName, StudentClass
    ) b ON a.id = b.minid
WHERE
    b.minid IS NULL
ALTER TABLE `Student`
  ADD UNIQUE INDEX `idx` (`StudentName`, `StudentClass`)

一个更好的方法是多列唯一索引(它也会优化搜索),即使不允许插入这样的重复项。以下是如何:

ALTER TABLE `Student`
  ADD UNIQUE INDEX `idx` (`StudentName`, `StudentClass`)
这应该起作用:

DELETE S FROM Student S
INNER JOIN(
    SELECT MIN(ID) AS ID,StudentName,StudentClass FROM Student
    GROUP BY StudentName,StudentClass
) S2 ON S.ID != S2.ID AND S.StudentName = S2.StudentName AND S.StudentClass = S2.StudentClass
它基本上是从子查询中的所有重复记录中选择最小ID。然后,我们只需删除与该类和名称匹配的所有内容,但我们不匹配最小Id,因此在一天结束时,我们将(大概)保留第一条记录中的重复项,并删除其余记录。

这应该可以:

DELETE S FROM Student S
INNER JOIN(
    SELECT MIN(ID) AS ID,StudentName,StudentClass FROM Student
    GROUP BY StudentName,StudentClass
) S2 ON S.ID != S2.ID AND S.StudentName = S2.StudentName AND S.StudentClass = S2.StudentClass

它基本上是从子查询中的所有重复记录中选择最小ID。然后,我们只需删除与该类和名称匹配的所有内容,但我们不匹配最小Id,因此在一天结束时,我们将保留(大概)第一条记录中的重复项,并删除其余记录。

将n.StudentClass添加到GROUP BY子句中。将n.StudentClass添加到GROUP BY子句中。