无意义SQL vs PHP if

无意义SQL vs PHP if,php,mysql,performance,Php,Mysql,Performance,我需要使用如下代码操作mySQL表中的条目 foreach($items as $item) { $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';"; $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'"; $dbh->exec($sql); } $items中可能有多达50个项目。

我需要使用如下代码操作mySQL表中的条目

foreach($items as $item)
{
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}
$items中可能有多达50个项目。此代码的一个变体是

foreach($items as $item)
{
 if ('z' != $img->img)
 $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid = '{$item->img}';";
 if ('z' != $item->lili)
 $sql .= "UPDATE `lists` SET refs = refs + 1 WHERE lid = '{$item->lili}'";
 $dbh->exec($sql);
}
在这两种情况下,我都为$items中的每个项执行一系列SQL语句。我的问题

  • 构建$sql并执行它不是更有效吗
  • 但若$items中的50个潜在项都产生了有意义的SQL,这不意味着执行的SQL语句会非常缓慢吗
  • 最后,在我的代码的第二个版本中执行PHP端if测试更好吗,还是只构建SQL并让mySQL处理WHERE测试返回空行的事实更好

  • 对此,我非常感谢您的帮助。

    您可以在子句中使用
    ,例如

    $sql = "UPDATE .... WHERE imid IN (" . implode($array_that_has_the_ids) . ")"
    
    并将自己简化为一个SQL查询。但是,如果您试图使用一个巨大的aray,这可能会失败-生成的查询可能会超过max_allowed_数据包设置并被杀死


    至于你的斯特伦。。。将strlen结果与
    'z'
    进行比较有什么意义?strlen返回一个整数,如果(apple==orange)
    ,则最好使用

    您可以在
    子句中使用
    ,例如

    $sql = "UPDATE .... WHERE imid IN (" . implode($array_that_has_the_ids) . ")"
    
    并将自己简化为一个SQL查询。但是,如果您试图使用一个巨大的aray,这可能会失败-生成的查询可能会超过max_allowed_数据包设置并被杀死


    至于你的斯特伦。。。将strlen结果与
    'z'
    进行比较有什么意义?strlen返回一个整数,如果(apple==orange)
    ,则最好使用

    首先,我建议您使用IN子句和两个单独的查询。。。 您可能需要转义$item->img和$item->lili这两个元素

    $ids = array("siteims"=>array(), "lists"=>array());
    foreach($items as $item)
    {
        $ids['siteims'][] = "'" . $item->img . "'";
        $ids['lists'][] = "'" . $item->lili . "'" ;
    }
    if(!empty($ids['siteims'])){
        $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid IN (".implode(',', $ids["siteims"]).")";
        $dbh->exec($sql);
    }
    
    if(!empty($ids['lists'])){
        $sql = "UPDATE `lists` SET refs = refs + 1 WHERE lid IN (".implode(',', $ids["lists"]).")";
        $dbh->exec($sql);
    }
    

    首先,我建议您使用IN子句和两个单独的查询。。。 您可能需要转义$item->img和$item->lili这两个元素

    $ids = array("siteims"=>array(), "lists"=>array());
    foreach($items as $item)
    {
        $ids['siteims'][] = "'" . $item->img . "'";
        $ids['lists'][] = "'" . $item->lili . "'" ;
    }
    if(!empty($ids['siteims'])){
        $sql = "UPDATE `siteims` SET refs = refs + 1 WHERE imid IN (".implode(',', $ids["siteims"]).")";
        $dbh->exec($sql);
    }
    
    if(!empty($ids['lists'])){
        $sql = "UPDATE `lists` SET refs = refs + 1 WHERE lid IN (".implode(',', $ids["lists"]).")";
        $dbh->exec($sql);
    }
    

    当然你可以构造测试来回答这些问题?似乎你的问题的答案在于另一个问题:你的瓶颈在哪里斯特伦($img->img)
    -那是什么?奥威尔发现了——那里不应该有斯特伦。我正在考虑加入另一个版本的代码,就像我在这个版本中所做的一样。你肯定可以构建测试来回答这些问题吗?似乎你的问题的答案在于另一个问题:你的瓶颈在哪里斯特伦($img->img)-那是什么?奥威尔发现了——那里不应该有斯特伦。我正在考虑加入另一个版本的代码,就像我加入这个版本一样。斯特伦的代码是一个骗局。当我把代码全部输入时,我正在考虑另一个版本的代码。strlen部分是一个骗局。当我输入所有代码时,我想到了另一个版本的代码。我“不接受”这个答案是有原因的。问题在于,如果存在重复条目,IN子句无法正确调整refs列。e、 g.如果我的数组最终包含('idA'、'idB'、'idA'、'idC'),则带有idA的行的refs列将只调整一次,而不是预期的结果。是的,我应该提到这一点。无论如何,谢谢你的回答。我已经投了赞成票。我“不接受”这个答案是有原因的。问题在于,如果存在重复条目,IN子句无法正确调整refs列。e、 g.如果我的数组最终包含('idA'、'idB'、'idA'、'idC'),则带有idA的行的refs列将只调整一次,而不是预期的结果。是的,我应该提到这一点。无论如何,谢谢你的回答。我投票赞成。