Есть ли лучший способ запустить несколько запросов SQL к одной таблице с помощью PHP? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть запрос, который запрашивает идентификатор (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 голосов
/ 08 апреля 2019

Что, почему вы делаете в основном один и тот же запрос 3 раза. Вы первый выбираете их все, ваш второй запрос требует ту же таблицу, убедившись, что номер заказа первых таблиц == номер заказа таблиц, а последний просто захватывает номер счета ...?

Просто сделайте один запрос:

SELECT internal_order_number, invoice_number FROM table WHERE ...

Затем пройдитесь по нему и сделайте то, что вам нужно. Вам не нужно 3 запроса ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...