【问题标题】:Optimize MySql Select query in PHP foreach loop优化 PHP foreach 循环中的 MySql Select 查询
【发布时间】:2014-06-26 15:05:02
【问题描述】:

请帮我优化以下 foreach 循环。它适用于小数组,当循环很短但问题是有时,当数组很大时,它会强制查询在 foreach 内循环很多次,这导致我的服务器卡住抛出一个503 错误。我需要以某种方式在 foreach 之外进行查询,但仍然可以选择 WHERE cat=$id[0] AND sub = $id[1] AND fir = $id[2]。

foreach($array as $id){
    $query=mysqli_query($con,"SELECT * FROM table WHERE cat=$id[0] AND sub = $id[1] AND fir = $id[2]");

    $thiss = mysqli_fetch_array($query);
    echo $thiss['name']; 
}

【问题讨论】:

  • 为什么你首先要做一个 foreach 查询循环而不是一个写得很好的查询?
  • 我该怎么做?请记住,我每次都需要选择 cat = x 和 sub = x 和 fir = x 的位置...
  • 能否请您对 $array 进行 var_dump,以便我了解数组包含的内容/您在宏伟计划中真正想要做的事情?
  • array(30) { [0]=> array(3) { [0]=> string(2) "10" [1]=> string(1) "3" [2] => 字符串(2) "12" } [1]=> 数组(3) { [0]=> 字符串(2) "10" [1]=> 字符串(1) "3" [2]=> 字符串(2) "13" } ..
  • 我有一个如下所示的数组:[0] => 1,2,3 [1] => 2,4,12 [2] => 1,3,7 等等..那些“随机数”以以前的形式收集..它们都链接到具有类别子类别和公司ID的复杂数据库..例如 [0] => 1(category), 2(subcategory), 3 (公司)..所以这就是为什么我需要使用 foreach 选择所有公司.. 它可以工作,但是当数组大于 20 或 50 个键时需要很多时间..

标签: php database optimization foreach


【解决方案1】:

试试这个

$cat = $sub = $fir = '';
foreach($array as $id){
  $cat .= $id[0].',';
  $sub .= $id[1].',';
  $fir .= $id[2].',';
}
$cat = substr_replace($cat, '', -1);
$sub = substr_replace($sub, '', -1);
$fir = substr_replace($fir, '', -1);
$sql = "SELECT * FROM table WHERE `cat` IN ($cat) AND `sub` IN($sub) AND `fir` IN ($fir)";
$query=mysqli_query($con,$sql);
while ($row = mysqli_fetch_array($query)) {
   echo $row['name']; 
}

【讨论】:

    【解决方案2】:
    $ands = array();
    foreach ($array as $id) {
        $ands[] = "(cat=$id[0] AND sub = $id[1] AND fir = $id[2])";
    }
    $ors = implode(' OR ', $ands);
    $query = mysqli_query($con, "SELECT name FROM TABLE WHERE $ors";
    while ($thiss = mysqli_fetch_assoc($query)) {
        echo $thiss['name'];
    }
    

    【讨论】:

    • $ors = implode(' OR ', $ors);需要 $ors = implode(' OR ', $ands);和 mysqli_fetch_assoc 而不是 mysql_fetch.. 非常感谢这个方法真的帮助了我!
    【解决方案3】:

    我不会详细说明为什么我建议您重新考虑您的查询逻辑,但对于手头的任务,请尝试以下操作:

    $where=array();
    foreach($array as $id){
      $where[]="cat=$id[0] AND sub = $id[1] AND fir = $id[2]";
    }
    $sql='SELECT * FROM table WHERE ('.implode(') OR (',$where).')';
    $query=mysqli_query($con,$sql);
    while ($thiss = mysqli_fetch_array($query))
      echo $thiss['name']; 
    

    【讨论】:

    • 非常感谢。正是我需要的!祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多