Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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,比较两个单列MYSQL表,从表A中添加表B中不存在的记录,并删除不存在的记录_Php_Mysql - Fatal编程技术网

使用PHP,比较两个单列MYSQL表,从表A中添加表B中不存在的记录,并删除不存在的记录

使用PHP,比较两个单列MYSQL表,从表A中添加表B中不存在的记录,并删除不存在的记录,php,mysql,Php,Mysql,我在数据库中有两个表,a和B。每个表只包含一列,电子邮件。因此,我想对照表A检查表B中的每封电子邮件,如果存在,则将其删除;如果它不存在,请添加它 如何做到这一点?理想情况下,您应该在纯SQL中做到这一点,而不必使用php 假设表A有一列A整数,表B有一列B整数。然后你可以这样做: create temporary table X as select a from A join B on A.a=B.b; delete from B where b in (select a from X); d

我在数据库中有两个表,a和B。每个表只包含一列,电子邮件。因此,我想对照表A检查表B中的每封电子邮件,如果存在,则将其删除;如果它不存在,请添加它


如何做到这一点?

理想情况下,您应该在纯SQL中做到这一点,而不必使用php

假设表A有一列
A整数
,表B有一列
B整数
。然后你可以这样做:

create temporary table X as select a from A join B on A.a=B.b;
delete from B where b in (select a from X);
delete from A where a in (select a from X);
insert into A (a) (select b from B);
select b from B where b not in (select a from A)
这样做的目的如下:

$db = new PDO($CONNECT_STRING, USERNAME, PASSWORD);
$db->exec("create temporary table X as select a from A join B on A.a=B.b");
$db->exec("delete from B where b in (select a from X)");
$db->exec("delete from A where a in (select a from X)");
$db->exec("insert into A (select b from B)");
$db = null;
  • 创建一个临时表,并将a和B中存在的所有记录插入其中
  • 从B中删除两个表中存在的所有记录
  • 从表中删除两个表中存在的所有记录
  • 在A中插入B中剩余的所有内容
  • 由于表X是临时创建的,因此在数据库连接关闭时,它将自动删除

    现在,如果需要从PHP调用此函数,可以执行以下操作:

    $db = new PDO($CONNECT_STRING, USERNAME, PASSWORD);
    $db->exec("create temporary table X as select a from A join B on A.a=B.b");
    $db->exec("delete from B where b in (select a from X)");
    $db->exec("delete from A where a in (select a from X)");
    $db->exec("insert into A (select b from B)");
    $db = null;
    
    编辑:

    如果您只需要B中不存在于A中的记录,那么您可以执行如下简单SQL:

    create temporary table X as select a from A join B on A.a=B.b;
    delete from B where b in (select a from X);
    delete from A where a in (select a from X);
    insert into A (a) (select b from B);
    
    select b from B where b not in (select a from A)
    

    如果两个表都匹配,您希望将记录从两个表中删除,还是只从一个表中删除?两者都要。一种更简单/更有效的方法是在一次运行中删除重复项(两者),然后将表B中剩余的电子邮件地址插入表A。。。那我该怎么做呢?你想删除重复的,然后制作重复的?什么?不。。。我想删除两个表中的重复项,然后将表B中剩余的非重复项插入表A中,或者只是将两个无重复项的表(从两个表中)连接起来。