我们有一个用(自动递增)id、classid、studentid设置的表。班级号是学生所上的班级的。有时,我们的系统会在同一个班级中创建同一个学生的副本。我们正在努力解决这个问题。这可能与按下后退按钮有关。学生经常上下一节课,所以我们不想删除学生的副本。我们要删除包含在同一个ClassID中的重复学生。例如:
ID | ClassID | StudentID
1 | 1 | 1
2 | 2 | 1
3 | 2 | 1
4 | 2 | 2
5 | 2 | 2
我想删除ID 3和5。我在网上搜索了这个答案,似乎找不到。我发现的最好的方法是分组,但是如何对每个类id进行分组,并在每个classid分组中找到重复项?
最佳答案
我读了一篇关于这种事情的有趣文章。大家都知道,像这样的查询来删除重复项并不是一件好事:
SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID;
在这种情况下,distinct将是最好的解决方案。但是,有时最好从一个不好的语法开始,比如上面的语法,这样做一个好的查询。首先,让我们选择重复的对:
SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID
HAVING COUNT(*) > 1;
您可能知道,也可能不知道,不能在删除查询中使用子查询删除行。你必须使用临时桌子。完整的代码如下:
CREATE TEMPORARY TABLE keep_lines AS
SELECT MAX(id) AS id_to_keep -- you can use MIN if wanted
FROM your_table
GROUP BY ClassID, StudentID;
DELETE FROM your_table
WHERE id NOT IN (SELECT id_to_keep
FROM keep_lines);
DROP TABLE keep_lines;
然后,正如许多其他人所说,向表中添加一个唯一的约束!