2017-11-11 86 views
1

我創建了兩個表,簡單註釋評論者,並將它們連接到INNER JOIN刪除內連接行

  • Simplecomments是每個評論者的每一個細節,涉及其評論,reg_date,commentorid等...
  • 評論者是評論者的個人信息有下列:ID,姓名,電子郵件..

我已經加入他們成功,但我很難從聯合表中刪除。

我想使它像這樣的邏輯:

  1. 如果有一個名爲--let評註的最後一行說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); 
       } 
      } 
    } 

} 

但是代碼將無法正常工作。我得到一個錯誤:

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

+0

請發佈你得到的結果和你期望得到的結果 –

+0

@BrianDewhirst我得到一個錯誤..「警告:mysql_num_rows()期望參數1是資源,」.. 我在最後兩段中的問題中已經說明了我希望如何。 –

+0

https://stackoverflow.com/questions/2973202/mysqli-fetch-array-mysqli-fetch-assoc-mysqli-fetch-row -expects-parameter-1 –

回答

2

考慮運行DELETE...INNER JOINDELETE與子查詢條件語句,避免PHP查詢獲取循環與if/else的邏輯似乎是以下幾點:

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

是的,所有三個DELETE可以在所有ID上同時運行,因爲互斥條件放在前兩個和最後一個之間。因此,前兩個影響行或最後一個影響每次迭代的行。未受影響的人將從兩個表中刪除零行。

此外,simplecomments記錄首先刪除,因爲這個表可能與評註外鍵約束,因爲它一個一對多的關係。最後,下面假設評論 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(); 
    } 
} 
+0

非常感謝你的男人,感激它!然而,c代表評論者,s代表簡單評論和sub? –

+1

太棒了!樂意效勞。是的,這些字母是實際表格的表別名,有助於縮短查詢時間,並有助於在使用相同表格的子查詢和外部查詢之間進行關聯。 – Parfait