【问题标题】:My Delete query isn't working properly我的删除查询无法正常工作
【发布时间】:2015-10-02 19:57:35
【问题描述】:

我在这里有点麻烦。我的删除查询无法正常工作。 问题是我正在使用内部联接从 4 个表中删除。两个表中的数据被删除,其余两个表中没有。

问题是 post 表包含多个记录,我必须删除所有记录。但它只删除第一个。并且 fields_data 表依赖于帖子表。因此,如果我能够从 posts 表中删除所有记录,那么问题也将在 fields_data 表中得到解决。

总结一下,我想做的就是根据以下查询从四个表(“Workspace_name”,“Posts”,“Fields”,“Fields_data”)中删除所有数据。我希望这对你有意义。代码写在下面。

感谢您的宝贵时间。更重要的是,它打印成功消息(Workspaces have been deleted)的次数与帖子表中的记录数一样多。但显然除了第一个之外它不会删除..

<?php

include "connection.php";

$sel="SELECT * FROM `posts` WHERE `workspace_id`='$workspace_id'";
$qus=mysqli_query($con,$sel);
$counter=mysqli_num_rows($qus);
if($qus){
    $pids=array();
    while($res=mysqli_fetch_assoc($qus)){
        $res['post_id'];
        $pids[]=$res['post_id'];
    }
}
else{
    echo mysqli_error($con);
}

for($i=0;$i<$counter;$i++){
    $dew="DELETE wn,f,p,fd
          FROM `workspace_name` AS wn
          INNER JOIN `fields` AS f 
          INNER JOIN `posts` AS p
          INNER JOIN `fields_data` AS fd
              ON wn.workspace_id=f.workspace_id AND p.post_id=fd.post_id
          WHERE wn.workspace_id='$workspace_id' AND p.post_id='$pids[$i]'";
    $quer=mysqli_query($con,$dew);
    if($quer){
        echo "Workspace and its corresponding fields have been deleted.. ";
    }
    else{
        echo mysqli_error($con);
    }
}

?>

【问题讨论】:

  • 参照完整性防止删除其他表?或者可能是不正确的删除顺序?
  • 您缺少某些JOIN 子句的ON 子句。
  • 您将加入workspace_namefields,并加入postsfields_data。但是没有将前两个表与后两个表关联起来的连接条件。
  • @xQbert 如果它违反了约束,我认为他会得到一个错误并且不会删除任何内容。
  • 你能用示例数据制作一个 sqlfiddle,并解释应该删除哪些行吗?

标签: php mysql


【解决方案1】:

您在 2 个表 fieldposts 上缺少 ON 条件

$dew="DELETE wn,f,p,fd
          FROM `workspace_name` AS wn
          INNER JOIN `fields` AS f _ON(wn.some_id = f.some_id)_
          INNER JOIN `posts` AS p  _ON(wn.some_id = c.some_id)_
          INNER JOIN `fields_data` AS fd
              ON wn.workspace_id=f.workspace_id AND p.post_id=fd.post_id
          WHERE wn.workspace_id='$workspace_id' AND p.post_id='$pids[$i]'";

【讨论】:

  • 这是不正确的,因为 where 条件只会删除 1 个帖子。
  • @shadow 他已经在where 中的两个表上应用了条件,所以这三个表都有可能使用这个条件匹配
  • 不行,看问题中代码开头的select查询。
  • 是的,我可以看到他正在从 1 个表中获取数据,然后他正在加入能够从该表中删除行的多个表 + 另一个 2 个表
【解决方案2】:

您需要在删除查询中正确连接 4 个表,并且不要使用循环。在第一个循环中,工作区将随帖子一起被删除,但在第二次迭代中,没有工作区,因此内部连接也不会从帖子表中产生任何记录。

DELETE wn,f,p,fd FROM `workspace_name` AS wn INNER JOIN `fields` AS f
ON wn.workspace_id=f.workspace_id INNER JOIN `posts` AS p
ON wn.workspace_id=p.workspace_id INNER JOIN `fields_data` AS fd
ON p.post_id=fd.post_id 
WHERE wn.workspace_id='$workspace_id'

【讨论】:

  • 你是 100% 正确的.. 但是我应该如何在没有循环的情况下删除多行帖子和 fields_data??
  • 您上面的查询将删除所有相应的工作区帖子...但是如何从 field_data 中删除记录,因为该表中没有 workspace_id 列...我应该添加一个还是有另一个方式??
  • 根据您的删除查询,fields_data 表与 post_id 字段上的 posts 表连接,所以我不明白您的问题!将我上面的查询变成一个选择,如果它从表中选择正确的记录,那么删除将删除正确的记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多