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
值?