无意义SQL vs PHP if
我需要使用如下代码操作mySQL表中的条目无意义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个项目。
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 = "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列将只调整一次,而不是预期的结果。是的,我应该提到这一点。无论如何,谢谢你的回答。我投票赞成。