Php 删除两列串联重复的行

Php 删除两列串联重复的行,php,mysql,Php,Mysql,表teh-1400行 我想删除重复了col1和col2的行 例如,如果col1是lorem和col2是ipsum 下一行也是-col1是lorem,col2是ipsum 应删除此下一行 这是我正在使用的代码,看不出有什么错误,因为最终结果是-只剩下一行,所有其他行都被删除 该表至少有一半关于col1和col2串联的唯一行 $st = $db->query("select id, col1, col2 from teh"); $st->execute(); $arr = $st->

teh
-
1400

我想删除重复了
col1
col2
的行

例如,如果
col1
lorem
col2
ipsum

下一行也是-
col1
lorem
col2
ipsum

应删除此
下一行

这是我正在使用的代码,看不出有什么错误,因为最终结果是-只剩下一行,所有其他行都被删除

该表至少有一半关于
col1
col2
串联的唯一行

$st = $db->query("select id, col1, col2 from teh");
$st->execute();
$arr = $st->fetchAll();
$check = [];
foreach($arr as $el){
    $str = $el['col1'] . $el['col2'];
    if(in_array($str, $check)){
        $sql = "delete from teh where id = :aid";
        $st = $db->prepare($sql);
        $st->execute([":aid" => $el['id']]);
    }
    else{
        array_push($check, $str);
    }
}

试着这样做:

$st = $db->query("select id, col1, col2 from teh");
$st->execute();
$arr = $st->fetchAll();
foreach($arr as $el){
    $sql = "delete from teh where col1 = acol1 and col2 = acol2 and id <> aid";
    $st = $db->prepare($sql);
    $st->execute([":acol1" => $el['col1'], ":acol2" => $el['col2'], ":aid" => $el['id']]);
}
$st=$db->query(“从teh中选择id、col1、col2”);
$st->execute();
$arr=$st->fetchAll();
外汇($arr为$el){
$sql=“从col1=acol1和col2=acol2和id-aid中删除”;
$st=$db->prepare($sql);
$st->execute([“:acol1”=>$el['col1'],“:acol2”=>$el['col2'],“:aid”=>$el['id']);
}

这样做的目的是删除所有值与此时正在检查的行相同的行,但
id
值不同。无需以这种方式将其连接并保存到数组。

如果要删除具有较高
id
但具有相同
col1
col2
值的行,只需
删除具有较低
id
值的匹配行

DELETE 
t1
FROM teh t1
JOIN teh t2 ON t2.col1 = t1.col1 AND t2.col2 = t1.col2 AND t2.id < t1.id
删除
t1
从t1开始
在t2.col1=t1.col1和t2.col2=t1.col2和t2.id

如果您遵循逻辑,我认为您可以不使用循环来完成。如果要删除重复记录,可以执行以下步骤

  • 获取唯一记录的
    id
    (只需使用一维数组返回即可)

    $sql=“按col1、col2从组中选择id;”;
    $stmt=$db->prepare($sql);
    $stmt->execute();
    $result=$stmt->fetchColumn()

  • 使用内爆将数组转换为字符串

    $toString=内爆(“,”,$result)

  • 删除不在列表中的记录。(以上查询的结果)

    $sql=“从id不在({$toString})中的位置删除;”;
    $stmt=$db->prepare($sql);
    $stmt->execute()

  • 要完成它:

    $sql = "SELECT id FROM teh GROUP BY col1, col2;";
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $result = $stmt->fetchColumn();
    
    $toString = implode(",",$result);
    
    $sql = "DELETE FROM teh where id NOT IN ({$toString});";
    $stmt = $db->prepare($sql);
    $stmt->execute();
    

    注意:从长远来看,循环SQL查询可能是一个大问题。还有很多其他方法可以做到这一点。

    您可能是指-
    $sql=“从col1=:acol1和col2=:acol2和id:aid”中删除似乎有效,剩下大约一半的行,关于
    col1
    col2
    concatenational,您知道如何检查剩余行是唯一的吗?
    col1
    col2
    属性的剩余行应具有不同的值,因此使用您的code-
    628
    行是剩余的。使用
    jeprubio的
    code-
    610
    行剩余。你能找到原因吗?@qadenza这是个好问题。如果看不到数据,就很难确定。是否可能存在任何
    NULL
    值?