使用 PDO Sqlserver 删除

Delete With PDO Sqlserver

早安,小伙伴们。我接到一个 API 电话,让我获取在我的网络系统中注册的 profilesId。我想从我的 sql 服务器 table 中删除我的请求响应中不包含的内容。

我用属性做了一个 select 以显示我与我的 slqserver table 和我的响应的共同点,然后我用剩余的进行删除。

理论上应该可以,但没有。

请问语法有误吗?

目前我的 sql 服务器 table 中有 391 个寄存器,只有 389 个与我的 sql 服务器 table 和响应调用通信。 当我做一个 select 时,只给我带来共同的寄存器,idk 没有工作。

Select查询(只带我说的389个寄存器是对的)

    foreach ($result as $indUser => $userInfos){
        $agentId = $userInfos['id'];
        $dhInsert = date("Y-m-d H:i:s");

        foreach ($userInfos['profileIds'] as $indProfile => $idProfile){

        $sql = "SELECT agentId, profileId
                                FROM LIVEPERSON_USERPROFILES
                                WHERE agentId = :agentId
                                AND profileId = :idProfile";

                                  
    $stmt = Conexao::getConnection()->prepare($sql);
    $stmt->bindValue(":agentId",$agentId,PDO::PARAM_STR);
    $stmt->bindValue(":idProfile",$idProfile,PDO::PARAM_STR);
    $rows = $stmt->execute();
        
        }
    }

删除查询 无效。

    foreach ($result as $indUser => $userInfos){
        $agentId = $userInfos['id'];
        $dhInsert = date("Y-m-d H:i:s");

        foreach ($userInfos['profileIds'] as $indProfile => $idProfile){

        $sql = "DELETE FROM LIVEPERSON_USERPROFILES
                WHERE NOT EXISTS (SELECT agentId, profileId
                                  FROM LIVEPERSON_USERPROFILES
                                  WHERE agentId = :agentId
                                  AND profileId = :idProfile)";

                                  
    $stmt = Conexao::getConnection()->prepare($sql);
    $stmt->bindValue(":agentId",$agentId,PDO::PARAM_STR);
    $stmt->bindValue(":idProfile",$idProfile,PDO::PARAM_STR);
    $rows = $stmt->execute();
        
        }
    }

table的数据:

insert into testTable (agentId, profileId) values ('1536989','12345')
insert into testTable (agentId, profileId) values ('1536989','56789')
insert into testTable (agentId, profileId) values ('1536989','99999')
insert into testTable (agentId, profileId) values ('1536874','56789')
insert into testTable (agentId, profileId) values ('1536874','56984')
insert into testTable (agentId, profileId) values ('7568594','99999')
insert into testTable (agentId, profileId) values ('8895874','56984')
insert into testTable (agentId, profileId) values ('8895874','56789')
insert into testTable (agentId, profileId) values ('8895874','77777')
insert into testTable (agentId, profileId) values ('8895874','99999')
insert into testTable (agentId, profileId) values ('1235689','56789')
insert into testTable (agentId, profileId) values ('1235689','77777')
insert into testTable (agentId, profileId) values ('1245365','56984')
insert into testTable (agentId, profileId) values ('1245365','56789')
insert into testTable (agentId, profileId) values ('1245365','77777')
insert into testTable (agentId, profileId) values ('1245365','99999')

观察:一个agentId可以有多个profileId,所以agentId是重复的。 在 table 的 数据中,我显示 agentId 1536989 的配置文件:12345、56789 和 99999。但根据要求,该代理只有 12345、56789 配置文件。所以我需要从 table 中删除技能 9999(如果成功的话)。

您不需要子查询。

$sql = "DELETE FROM LIVEPERSON_USERPROFILES
        WHERE agentId = :agentId AND profileId <> :idProfile)";

我是怎么解决的:

首先,在我用来打开响应循环的 foreach 中,我创建了一个数组来保存这些值并在查询字符串中进行转换:

    foreach ($result as $indUser => $userInfos){
        $agentId = $userInfos['id'];
        $dhInsert = date("Y-m-d H:i:s");
        $forDelete[] = array(
            'agentIdForDelete' => "'".$agentId."'",
            'profileIdForDelete' => "'".implode("','",$userInfos['profileIds'])."'",

        );

之后,我打印 $forDelete 并得到以下响应: Responsejson

然后我设置一个循环来迭代索引并执行我的删除查询:

    for ($i = 0; $i < count($forDelete); $i++){

        $agentIdForDelete = $forDelete[$i]['agentIdForDelete'];
        $profileIdForDelete = $forDelete[$i]['profileIdForDelete'];
    

        $sql = "DELETE FROM LIVEPERSON_USERPROFILES
                WHERE agentId = $agentIdForDelete AND profileId NOT IN ($profileIdForDelete)";

        $stmt = Conexao::getConnection()->prepare($sql);
        $stmt->execute();

    }

这就是我找到的解决问题的方法。如果有人有其他建议,我有空 :D