Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除表中有两个变量要考虑的重复项_Php_Mysql_Database_Duplicates_Sql Delete - Fatal编程技术网

Php 删除表中有两个变量要考虑的重复项

Php 删除表中有两个变量要考虑的重复项,php,mysql,database,duplicates,sql-delete,Php,Mysql,Database,Duplicates,Sql Delete,我们有一个使用(自动递增)ID、ClassID和StudentID设置的表。班级id是学生正在上课的班级的id。有时我们的系统会在同一个班级中创建同一个学生的副本。我们目前正在努力解决这个问题。这可能与按下后退按钮有关学生通常会参加下一节课,因此我们不想删除重复的学生。我们要删除包含在同一classID中的重复学生例如: ID | ClassID | StudentID 1 | 1 | 1 2 | 2 | 1 3 | 2 | 1

我们有一个使用(自动递增)ID、ClassID和StudentID设置的表。班级id是学生正在上课的班级的id。有时我们的系统会在同一个班级中创建同一个学生的副本。我们目前正在努力解决这个问题。这可能与按下后退按钮有关

学生通常会参加下一节课,因此我们不想删除重复的学生。我们要删除包含在同一classID中的重复学生
例如:

ID | ClassID | StudentID
1  |   1     |     1
2  |   2     |     1
3  |   2     |     1
4  |   2     |     2
5  |   2     |     2

我想删除ID 3和5。我在网上搜索了这个答案,但似乎找不到。我发现最好的方法是分组,但如何对每个类id进行分组并在每个classID分组中找到重复项?

您不能
删除或
更新用于引用的同一表的记录。因此,您需要创建一个临时表作为引用。或者创建一个PHP脚本,该脚本将触发匹配ID的
DELETE
命令

下面是一个SQL查询示例:

SELECT MIN(ID) AS minID, ClassID, StudentID
FROM the_table GROUP BY ClassID, StudentID HAVING COUNT(StudentID) > 1

您可以多次运行此操作,它将继续删除重复项。

您不能
删除或
更新用于引用的同一表的记录。因此,您需要创建一个临时表作为引用。或者创建一个PHP脚本,该脚本将触发匹配ID的
DELETE
命令

下面是一个SQL查询示例:

SELECT MIN(ID) AS minID, ClassID, StudentID
FROM the_table GROUP BY ClassID, StudentID HAVING COUNT(StudentID) > 1

您可以多次运行此操作,它将继续删除重复的行。

您可以使用以下SQL语句删除除最早的唯一行以外的所有行:

create temporary table unique_ids as
select min(id) as ID
  from some_table
 group by ClassID, StudentID;

delete some_table
  from some_table
       left join unique_ids using (id)
 where unique_ids.id is null;

如果您在一个大表上运行,请考虑在创建临时表后添加索引。

< P>可以使用以下SQL语句删除所有但最早的唯一行:

create temporary table unique_ids as
select min(id) as ID
  from some_table
 group by ClassID, StudentID;

delete some_table
  from some_table
       left join unique_ids using (id)
 where unique_ids.id is null;

如果你在一个大的表上运行,考虑在创建临时表之后添加一个索引。

< p>你可以找到另一个APPROUCH。
但是ClassID和StudentID的唯一关键约束是您确实需要做的事情。

您可以找到另一种方法。
但是ClassID和StudentID的唯一关键约束是你必须要做的。

我读了一篇关于这类内容的有趣文章。众所周知,执行这样的查询来删除重复项不是一件好事:

SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID;
在这种情况下,DISTINCT将是最佳解决方案。但是,有时最好从上面的语法开始,以生成一个好的查询。首先,让我们选择重复的对:

SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID
HAVING COUNT(*) > 1;
您可能知道,也可能不知道,您不能使用delete查询中的子查询删除行。您必须使用临时表。执行此操作的完整代码如下所示:

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;

然后,正如许多其他人所说的,向您的表添加一个唯一的约束

我读了一篇关于这类事情的有趣文章。众所周知,执行这样的查询来删除重复项不是一件好事:

SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID;
在这种情况下,DISTINCT将是最佳解决方案。但是,有时最好从上面的语法开始,以生成一个好的查询。首先,让我们选择重复的对:

SELECT ClassID, StudentID
FROM your_table
GROUP BY ClassID, StudentID
HAVING COUNT(*) > 1;
您可能知道,也可能不知道,您不能使用delete查询中的子查询删除行。您必须使用临时表。执行此操作的完整代码如下所示:

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;

然后,正如许多其他人所说的,向您的表添加一个唯一的约束

我强烈建议使用临时表的解决方案。简单、快速且不受复杂查询的影响。只需创建一个类似的表(可能type=MEMORY以提高速度),然后使用简单的selectdistinct查询插入所有行,截断原始表并用临时表中的数据替换表数据


当然,这只适用于在此期间可以停止生产的数据库。

我强烈建议使用临时表的解决方案。简单、快速且不受复杂查询的影响。只需创建一个类似的表(可能type=MEMORY以提高速度),然后使用简单的selectdistinct查询插入所有行,截断原始表并用临时表中的数据替换表数据


当然,这只适用于可以在该期间停止生产的数据库。

最好的解决方案是回到时间并对表应用
唯一(ClassID,StudentID)
约束。好吧,也许我不理解您的问题,但ID 2和3不是重复的吗,不是3和5???3和5是2和4的副本…最好的解决方案是回到时间并对表应用
unique(ClassID,StudentID)
约束。好吧,也许我不理解你的问题,但ID 2和3不是重复的吗?不是3和5???3和5是2和4的副本…使用PHP(或SQL以外的任何其他语言)在我看来有点过分。PHP速度慢,您的RDBMS设计用于执行类似操作。@Vincent同意。但OP标记了PHP,所以我提到它作为临时表的替代。但是,您的答案是可靠的。+1使用PHP(或SQL以外的任何其他语言)在我看来,这有点过火了。PHP太慢了,您的RDBMS被设计用来做这样的操作。@Vincent同意。但是OP标记了PHP,所以我提到它作为临时表的替代。但是,您的答案是肯定的。+1我认为您的临时表应该被称为
保留行
而不是
重复行
,因为它看到了ms他想要id中较低的一个,使用
MIN()
,你忘记了
作为id\u to\u keep
。但是-很好的答案--+1你说得对,我将重命名该表。我还添加了关于MIN的注释,并添加了“id\u to\u keep”.我认为您的临时表应该称为
keep_line
而不是
replicate_line
,因为他似乎想要id中的较低者,所以使用
MIN