使用 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
早安,小伙伴们。我接到一个 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