php - 使用内部连接删除行

标签 php mysql sql join

我创建了两个表,simplecommentscommentors,并使用 INNER JOIN 连接它们。

  • Simplecomments 是每个评论者的详细信息,包括他们的评论、reg_date、commentorid 等...
  • Commentors 是评论者的个人信息,包括以下几列:id、name、email..

我已经成功加入它们,但是我发现很难从加入的表中删除。

我想做成这样的逻辑:

  1. 如果评论者的最后一行名为——比方说 A—— 然后从表中删除他/她的评论详细信息和 A 他/她自己。

  2. Else如果A评论了很多次,有不同的评论,删除他/她的评论细节,但保留他/她的个人信息,因为A在那里有其他评论。

我是这样实现的:

if (!empty($_POST["delete"]))
{
    foreach ($_POST["delete"] as $key => $value) 
    {
        $resultid = $conn->query("SELECT commentorid FROM `simplecomments` WHERE id=".$value);
        $rowid = $resultid->fetch_assoc();

        $outputdelete = $rowid["name"] . " has been deleted" . "<br>";

        $deletedname = $deletedname.$outputdelete;
        $RES = mysql_num_rows($resultid);
        $counter = 0;
            while($row = $RES)
            {
               //IF IT'S LAST ROW, DELETE COMMENTOR AND HIS/HER COMMENTDETAILS 
                if(++$counter == $results) {
                    $resultid = $conn->query("DELETE FROM `commentor`");
                }
                //ELSE JUST DELETE HIS/HER COMMENTDETAILS, LET HIS/HER INFO REMAIN
                else{
                    $resultid = $conn->query("DELETE FROM `simplecomments` WHERE id=".$value);
                } 
            }
    }

}

但是代码将不起作用。我得到一个错误:

Warning: mysql_num_rows() expects parameter 1 to be resource [..]...

最佳答案

考虑使用子查询条件运行 DELETE...INNER JOINDELETE 并避免以 if/else 为逻辑的 PHP 查询获取循环似乎是以下内容:

  1. 删除任何评论者的个人资料和评论,如果他/她只有一条评论
  2. 如果评论者有多个(即不止一个)评论,则只删除他/她的评论。

是的,所有三个 DELETE 都可以在所有 id 上同时运行,因为互斥条件位于前两个和最后一个之间。因此,前两个影响行或最后一个影响每次迭代的行。未受影响的人将从任一表中删除零行。

此外,simplecomments 记录首先被删除,因为该表由于其一对多关系可能具有带有commentor 的外键约束。最后,下面假设 comment id 被传递到循环中(不是 commentor id)。

PHP (使用参数化,假设 $conn 是一个 mysqli 连接对象)

foreach ($_POST["delete"] as $key => $value) {

   // DELETE COMMENTS AND THEN PROFILE FOR COMMENTORS WITH ONE POST    
   $sql = "DELETE FROM `simplecomments` s 
           WHERE s.id = ?
             AND (SELECT COUNT(*) FROM `simplecomments` sub
                  WHERE sub.commentorid = s.commentorid) = 1";
   $stmt = $conn->prepare($sql);
   $stmt->bind_param("i", $value);
   $stmt->execute();
   $stmt->close();

   $sql = "DELETE c.* FROM `simplecomments` c 
           INNER JOIN `simplecomments` s ON s.commentorid = c.id
           WHERE s.id = ?
             AND (SELECT COUNT(*) FROM `simplecomments` sub
                  WHERE sub.commentorid = s.commentorid) = 1";
   $stmt = $conn->prepare($sql);
   $stmt->bind_param("i", $value);
   $stmt->execute();
   $stmt->close();


   // DELETE COMMENTS FOR COMMENTORS WITH MULTIPLE POSTS BUT KEEP PROFILE
   $sql = "DELETE FROM `simplecomments` s
           WHERE s.id = ?
             AND (SELECT COUNT(*) FROM `simplecomments` sub
                  WHERE sub.commentorid = s.commentorid) > 1";    
   $stmt = $conn->prepare($sql);
   $stmt->bind_param("i", $value);
   $stmt->execute();
   $stmt->close();
}

或者,对于 DRY-er 方法,在数组中循环 SQL 语句:

$sqls = array(
           0 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1",
           1 => "DELETE c.* FROM `simplecomments` c INNER JOIN `simplecomments` s ON s.commentorid = c.id WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) = 1",
           2 => "DELETE FROM `simplecomments` s WHERE s.id = ? AND (SELECT COUNT(*) FROM `simplecomments` sub WHERE sub.commentorid = s.commentorid) > 1"
        );

foreach ($_POST["delete"] as $key => $value) {
   foreach($sqls as $sql) {
       $stmt = $conn->prepare($sql);
       $stmt->bind_param("i", $value);
       $stmt->execute();
       $stmt->close();
   }
}

关于php - 使用内部连接删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47238602/

相关文章:

php - 请求准备文件并返回路径,准备好后允许用户下载

mysql - Sql Union 或 Join 或两者一起

sql - 使用 'unlimited' 时可以指定 "Select TOP (@variable) * From"吗?

javascript - js提交后检查按钮是否被按下

php - mysql中插入特殊字符

php - 如何在 Dropdownlist 中动态分配数据库值?

mysql - SQL,查找两个人之间对话的最新条目

mysql - 两个 LEFT JOIN 是否用于生成笛卡尔积?

php - 架构文件托管 ftp 服务器

mysql - UPDATE 中的 SQL 随机值