如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server

Posted

技术标签:

【中文标题】如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server【英文标题】:How to select different values in a column with the same ID and then delete them PHP SQL Server 【发布时间】:2020-06-01 23:00:58 【问题描述】:

我是编程世界的新手。我在这句话中需要帮助。我想要做的是从 CardIndex 列中选择 0.1,2 值,然后能够删除它们。只要满足条件,就必须删除行。或者最好的方法是什么。

CardIndex 列必须有 3 个值 yes 或 yes 才能执行删除。否则不会执行

$query = "SELECT * FROM CardData where UserIndex='$id' and CardIndex in (0,1,2) ";
$resultados = sqlsrv_query($conn,$query);

if($query1 = sqlsrv_fetch_array($resultados))
        if($query1 == true)
        $cro =  "DELETE FROM CardData WHERE UserIndex='$id' and CardIndex in (0,1,2)";
        $query3 = sqlsrv_query($conn,$cro); 
        

    echo 'funciona';
    

    else
     echo 'no funciona';    


?>

【问题讨论】:

【参考方案1】:

您需要or,而不是and - 否则您搜索CardIndex 同时具有所有三个值的行,这显然永远不会发生:

DELETE FROM CardData 
WHERE 
    UserIndex = @UserIndex
    AND (CardIndex = 1 OR CardIndex = 2 OR CardIndex = 3)

这可以用IN缩短:

DELETE FROM CardData 
WHERE UserIndex = @UserIndex AND CardIndex IN (1, 2, 3)

请注意,在删除它们之前SELECTing 值是没有意义的。您可以直接触发DELETE:如果没有符合条件的行,则不会发生实际删除。

最后:不要连接查询字符串中的变量;这是低效的,并且会将您的代码暴露给 SQL 注入。相反,您应该使用参数化查询(有很多在线资源可以解释如何做到这一点)。


编辑

只有当所有三个cardIndex 值都可用于给定的userIndex 时,您才想删除所有三个记录。假设没有重复的(userIndex, cardIndex),一种方法是可更新的 CTE:

with cte as (
    select count(*) over() cnt
    from cardData
    where userIndex = @UserIndex and cardIndex in (1, 2, 3)
)
delete from cte where cnt = 3

【讨论】:

in (1,2,3) 确实有效,但不满足条件,即 CardIndex 包含强制值 0,1,2。如果这 3 个值不存在,则不应执行删除。 CardIndex 列必须具有 3 个值 yes 或 yes 才能执行删除。否则不会执行。 @IchigoKurosaki:啊,好的。那就更有意义了。请参阅我的更新答案。 运行时在 php 中不起作用 :( 警告:sqlsrv_fetch_array () 期望参数 1 是资源,$ query = "with cte as (SELECT count (*) over () cnt FROM CardData where UserIndex = $id and CardIndex in (1, 2, 3))"; @IchigoKurosaki:您似乎忘记了查询的一部分(以delete 开头的那个)。

以上是关于如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

计算具有相同 id 的列的值的存储过程

如何在 BigQuery 的标准 SQL 中解析具有不同日期字符串的列中的值

在Laravel中获取具有不同外国ID的列中的最大值

如何创建临时表或仅从循环中的列中选择不同的值

查询以从与给定值相同的列中选择值,但不同的行

访问具有相同 ID 但在其他 2 列中具有不同值的选择行