1

複数の mysql SELECT クエリを回避するために、SELECT を foreach ループから外そうとします。

クエリは

 SELECT    o.orders_id,
          o.date_purchased,
          o.orders_status,
          ot.text AS order_total,
          os.orders_status_name
FROM      " . TABLE_ORDERS . " o
JOIN      " . TABLE_ORDERS_TOTAL . " ot ON (o.orders_id = ot.orders_id AND ot.class = 'ot_total')
JOIN      " . TABLE_ORDERS_STATUS . " os ON (o.orders_status = os.orders_status_id AND os.language_id = " . (int)$_SESSION['languages_id'] . ")
WHERE     o.customers_id = " . (int)$_SESSION['customer_id'] . "
ORDER BY  orders_id DESC

その結果、 $history_result['RESULT'] という配列が得られ、次のようになります

Array
(
  [0] => Array
  (
    [orders_id] => 309
    [date_purchased] => 2013-10-02 15:49:54
    [orders_status] => 1
    [order_total] =>  9,00 €
    [orders_status_name] => Offen
  )
  [1] => Array
  (
    [orders_id] => 308
    [date_purchased] => 2013-10-02 15:39:54
    [orders_status] => 1
    [order_total] =>  9,00 €
    [orders_status_name] => Offen
  )
  [2] => Array
  (
    [orders_id] => 307
    [date_purchased] => 2013-10-02 15:33:48
    [orders_status] => 1
    [order_total] =>  9,00 €
    [orders_status_name] => Offen
  )
)

次の foreach-loop は、次の MySql-Query です。

foreach ($history_result['RESULT'] as $history) {
  $trackings   = $db->result("-- 03 account_history_info.php
    SELECT o.ortra_parcel_id,
           c.carrier_tracking_link,
           c.carrier_name
    FROM   " . TABLE_ORDERS_TRACKING . " o
    JOIN   " . TABLE_CARRIERS . " c ON o.ortra_id = c.carrier_id
    WHERE  ortra_order_id = " . $history['orders_id']
  );
}

次のような SQL ステートメントを作成できるように、配列要素「orders_id」に直接アクセスするにはどうすればよいですか

$trackings   = $db->result("-- 03 account_history_info.php
    SELECT o.ortra_parcel_id,
           c.carrier_tracking_link,
           c.carrier_name
    FROM   " . TABLE_ORDERS_TRACKING . " o
    JOIN   " . TABLE_CARRIERS . " c ON o.ortra_id = c.carrier_id
    WHERE  ortra_order_id IN = " . implode(',', $fooArray)
  );
4

3 に答える 3

1
foreach ($history_result['RESULT'] as $history) {
    $fooArray[] = $history['orders_id']
}
于 2013-10-02T21:02:02.303 に答える
0

Can you just used a nested select to combine the queries you have to perform, into one query, like:

SELECT FROM (SELECT FROM ... )

Or am I perhaps missing some subtlety?

于 2013-10-02T21:02:46.803 に答える
0
$fooArray = array_column($history_result['RESULT'], 'orders_id');

注意: PHP 5 >= 5.5.0

于 2013-10-02T21:03:28.243 に答える