簡體   English   中英

用內部聯接刪除一行

[英]Deleting a row with inner join

我創建了兩個表, simplecommentscommentors ,並將它們與INNER JOIN連接起來。

  • Simplecomments是每個評論者的詳細信息,包括他們的評論,reg_date,commentorid等。
  • 評論者是評論者的個人信息,其中包括以下幾列:ID,名稱,電子郵件..

我已經成功加入了他們,但是我發現很難從加入的表中刪除它們。

我想使它像這樣的邏輯:

  1. 如果評論者的最后一行叫-讓我們說A-,則從表中刪除他/她的評論詳細信息和A本人。

  2. 否則,如果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);
                } 
            }
    }

}

但是代碼不起作用。 我收到一個錯誤:

警告:mysql_num_rows()期望參數1為資源[..] ...

考慮使用子查詢條件條件運行DELETE...INNER JOINDELETE ,並避免使用if/else PHP查詢獲取循環,因為邏輯似乎如下:

  1. 刪除任何評論者的個人資料和評論(如果他/她只有一條評論)
  2. 如果評論者有多個(即,多個)評論,則僅刪除該評論者的評論。

是的,由於互斥條件位於前兩個和最后一個之間,因此可以在所有id上同時運行所有三個DELETE 因此,每次迭代前兩個影響行或后一個影響行。 不受影響的表將從任一表中刪除零行。

另外,由於該表與一對一的關系可能具有帶有注釋器的外鍵約束,因此首先刪除了簡單注釋記錄。 最后,以下假設評論的ID被傳遞到循環(未評注者 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();
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM