【问题标题】:MySQL not decrementing valuesMySQL不递减值
【发布时间】:2011-09-08 23:02:35
【问题描述】:

当我尝试删除帖子时,我无法让帐户表中的值减少。我想减少的值是“PostCount”、“Likes Count”和“CommentsCount”。目前只有“PostCount”有效。

请你告诉我我做错了什么:

$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");

【问题讨论】:

  • 两个问题/cmets:1.PostCount是什么数据类型? 2. 为什么不直接使用触发器?
  • 我想用它作为触发器,但是我没有超级权限,postcount是一个int

标签: php mysql decrement


【解决方案1】:

我重新编写了包含我发布的代码的 if 语句,它现在可以正常工作:

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");

【讨论】:

    【解决方案2】:

    首先循环查询会缩短执行时间。您希望将其限制为尽可能少的查询,这就是 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 个查询与多个查询。我不确定这是否能解决您的问题,但这是朝着修复代码的正确方向迈出的一大步。

    【讨论】:

    • 感谢您的帮助,我刚刚重新编写了包含我发布的代码的 if 语句,并且可以正常工作。我将在答案中发布我的代码。
    猜你喜欢
    • 2016-09-04
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多