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子句中。