2011-06-06 52 views
0

當我嘗試刪除帖子時,我無法獲取表格中的值。我想遞減的值是「PostCount」,「喜歡計數」和「評論計數」。目前只有「PostCount」的作品。MySQL不會遞減值

請你能告訴我什麼,我做錯了:

$arg = mysql_query("SELECT `numberOfLikes` FROM Posts WHERE `id` = '$postID'") or die(mysql_error()); 

    $query = mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID'"); 
    while ($row = mysql_fetch_assoc($query)) { 
     $b = $row['accountID']; 
     mysql_query("UPDATE Accounts SET `numberOfLikes` = (`numberOfLikes` - 1) WHERE `id` = '$b'"); 
    } 
    $arg = mysql_query("SELECT `numberOfComments` FROM Posts WHERE `id` = '$postID'"); 
    $query = mysql_query("SELECT * FROM Posts WHERE `id` = '$postID'"); 
    while($row = mysql_fetch_assoc($arg)) { 
     $b = $row['accountID']; 
     mysql_query("UPDATE Accounts SET `CommentsCount` = (`CommentsCount` - 1) WHERE `id` = '$b'"); 
    } 
    $arg = mysql_query("SELECT `PostCount` FROM Accounts WHERE `id` = '$accountID'"); 
    while ($row = mysql_fetch_assoc($arg)) { 
     mysql_query("UPDATE Accounts SET `PostCount` = (`PostCount` - 1) WHERE `id` = '$accountID'"); 
    } 
    mysql_query("DELETE FROM Likes WHERE `postID` = '$postID'"); 
    mysql_query("DELETE FROM Comments WHERE `postID` = '$postID'"); 
    mysql_query("DELETE FROM Posts WHERE `id` = '$postID' AND `accountID` = '$accountID'") or die(mysql_error()); 
    exit("Deleted post"); 
+0

兩個問題/評論:1.什麼樣的數據類型是'PostCount'? 2.爲什麼不使用觸發器? – 2011-06-06 00:04:37

+0

我想使用它作爲觸發器,但我沒有超級priveleges,postcount是int – 2011-06-06 00:05:40

回答

0

我重新編碼的我,如果我包含發佈的代碼聲明,它現在可以正常使用:

mysql_query("UPDATE Accounts SET `PostCount` = (`PostCount` - 1) WHERE `id` = '$accountID'"); 
     $query = mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID'") or die(mysql_error()); 
     while($row = mysql_fetch_assoc($query)) { 
      $accID = $row['accountID']; 
      mysql_query("UPDATE Accounts SET `Likes Count` = (`Likes Count` - 1) WHERE `id` = '$accID'"); 
     } 
     $query = mysql_query("SELECT * FROM Comments WHERE `postID` = '$postID'"); 
     while($row = mysql_fetch_assoc($query)) { 
      $accID = $row['accountID']; 
      mysql_query("UPDATE Accounts SET `CommentsCount` = (`CommentsCount` - 1) WHERE `id` = '$accID'"); 
     } 
     mysql_query("DELETE FROM Likes WHERE `postID` = '$postID'"); 
     mysql_query("DELETE FROM Comments WHERE `postID` = '$postID'"); 
     mysql_query("DELETE FROM Posts WHERE `id` = '$postID' AND `accountID` = '$accountID'") or die(mysql_error()); 
     exit("Deleted post"); 
1

首先登場的循環查詢殺死你的執行時間。你想將其限制在儘可能少的查詢成爲可能,這就是implode發揮作用:

// what is this for? I do not see it being used. $arg = mysql_query("SELECT `numberOfLikes` FROM Posts WHERE `id` = '$postID'") or die(mysql_error()); 

$query = mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID'"); 
while ($row = mysql_fetch_assoc($query)) { 
    $b[] = $row['accountID']; 
} 
mysql_query("UPDATE Accounts SET `numberOfLikes` = (`numberOfLikes` - 1) WHERE `id` IN(" . implode(',', $b) . ")") or trigger_error('MySQL Update Failed: ' . mysql_error()); 

這將是更有效和有同樣的效果。

下一個查詢,應該是相似的:

$arg = mysql_query("SELECT `numberOfComments` FROM Posts WHERE `id` = '$postID'"); 
// again an extra unnecessary query not being used. $query = mysql_query("SELECT * FROM Posts WHERE `id` = '$postID'"); 
$b=array(); 
while($row = mysql_fetch_assoc($arg)) { 
    $b[] = $row['accountID']; 
} 
mysql_query("UPDATE Accounts SET `CommentsCount` = (`CommentsCount` - 1) WHERE `id` IN(".implode(',', $b) . ")") or trigger_error(mysql_error()); 

這下一個,我甚至不知道爲什麼你通過它循環:

//$arg = mysql_query("SELECT `PostCount` FROM Accounts WHERE `id` = '$accountID'"); 
//while ($row = mysql_fetch_assoc($arg)) { 
mysql_query("UPDATE Accounts SET `PostCount` = (`PostCount` - 1) WHERE `id` = '$accountID'") or trigger_error(mysql_error()); 
//} 

當你不使用這些數據的任何地方,只需運行更新查詢。

執行上述操作可以加快您的應用程序並減少冗餘。 implode非常方便,運行1個查詢與幾個幾乎總是首選。我不確定這是否能解決您的問題,但這是修正代碼的正確方向邁出的巨大一步。

+0

感謝您的幫助,我只是重新編寫了包含我發佈的代碼,我有它的工作的if語句。我將在一個答案中發佈我的代碼。 – 2011-06-06 00:34:19