是否有更好的方法使用PHP对同一个表运行多个SQL查询?

时间:2019-04-08 16:49:24

标签: php mysql mysqli

我有一个查询,该查询请求一个ID(PK)和一个订单号并将它们放入一个数组中。然后,我遍历数组中返回的数据并运行另外两个查询,以查找订单号在数据库中显示的次数,并获取属于该订单号的发票号。我在此设置中看到的问题是返回编译的数据数组需要花费一些时间(大约9秒)。有没有更快的方法来获取我正在寻找的返回结果?

我试图在线找到一些文章,并且遇到mysqli_multi_query。这是进行多个查询以收集我要获取的数据类型的更好方法吗?

<?php
    require 'config.php';
    $sql = "SELECT id,internal_order_number FROM orders GROUP BY internal_order_number ORDER BY created_date desc LIMIT 0 ,50";
    $query=mysqli_query($mysqli, $sql);
    if (!$query) {
        throw new Exception(mysqli_error($mysqli)."[ $sql]");
    }
    $data = array();
    while( $row=mysqli_fetch_array($query) ) {  // preparing an array
      $nestedData=array();
      $nestedData['line_id'] = $row["id"];
      $nestedData['internal_order_number'] = $row["internal_order_number"];
      $data[] = $nestedData;
    }
    $compiled_data = array();

    // Loop through data array with additional queries
    foreach($data as $line){
      $new_data = array();

      // Get item counts
      $item_counts = array();
      $get_count = " SELECT internal_order_number FROM orders WHERE internal_order_number = '".$line['internal_order_number']."' ";
      $count_query=mysqli_query($mysqli, $get_count);
      while ($counts=mysqli_fetch_array($count_query)){
        if (isset($item_counts[$counts['internal_order_number']])) {
          $item_counts[$counts['internal_order_number']]++;
        } else {
          $item_counts[$counts['internal_order_number']] = 1;
        }
      }
      $product_count = $item_counts[$line['internal_order_number']];

      // Get invoice numbers
      $invoice_array = array();
      $get_invoices = " SELECT invoice_number FROM orders WHERE internal_order_number = '".$line['internal_order_number']."'";
      $invoice_query=mysqli_query($mysqli, $get_invoices);
      while ($invoice=mysqli_fetch_array($invoice_query)){
        if(!in_array($invoice['invoice_number'], $invoice_array)){
          $invoice_array[] = $invoice['invoice_number'];
        }
      }
      $invoices = implode(", ",$invoice_array);

      $new_data['order_number'] = $line['internal_order_number'];
      $new_data['count'] = $product_count;
      $new_data['invoices'] = $invoices;
      $compiled_data[] = $new_data;
    }
    mysqli_close($mysqli);
    print_r($compiled_data);
?>

1 个答案:

答案 0 :(得分:0)

什么,为什么您要进行3次基本相同的查询。您第一个选择了所有商品,第二个查询需要相同的表格,请确保第一个表格的订单号==表格的订单号,最后一个只是获取发票号...?

只需执行一个查询:

SELECT internal_order_number, invoice_number FROM table WHERE ...

然后遍历它并执行您需要的操作。您不需要3个查询...

相关问题