2016-04-03 84 views
0

我有一個查詢,我正在把結果放入數組中。 查詢返回兩個表的所有數據:orderorderdetails如何使用LEFT JOIN mysql查詢輕鬆地在PHP中分割結果?

SELECT orders.*, order_details.* FROM `webshop_orders` 
     LEFT JOIN `order_details` 
     ON `orders`.`order_id` = `order_details`.`f_order_id` 
     WHERE `orders`.`f_site_id` = $iSite_id AND `orders`.`order_id` = $iOrder_id;"; 

我試圖找出如何返回這個數據把它們按以下格式的數組:

$aOrders = array(
0=>array(Orders.parameter1=>value, orders.parameter2=>value, orders.parameter3=>value, 'orderdetails'=>array(
    array(Orderdetails.parameter1=>value, orderdetails.parameter2=>value))); 

我目前將每個結果作爲關聯數組返回並根據其名稱使用2個鍵數組手動分割每個變量,但這看起來非常「勞動密集」?

while($aResults = mysql_fetch_assoc($aResult)) { 
    $i++; 
    foreach($aResults as $sKey=>$mValue){ 
     if(in_array($sKey, $aOrderKeys){ 
      $aOrder[$i][$sKey] = $mValue; 
     } else { 
      $aOrder[$i]['orderdetails'][$sKey] = $mValue; 
     } 
    } 
} 

編輯:上面的函數並沒有考慮多個訂單細節,但函數的意思是作爲一個例子!

有沒有更簡單的方法,或者我可以使用更好的查詢呢?

+0

如果你想要兩個數組,需要2次訪問數據庫。一次爲訂單,一次爲這些訂單的細節。通過留下加入你導致你正在嘗試修復的分裂問題。 – xQbert

+0

嗯,我猜想性能明智讓PHP和MySQL處理一個查詢而不是2比2個查詢更好? – Abayob

+0

就我個人而言,我發現我需要處理的數據集,沒有更多更容易。我不知道完整的用例,我不能說哪種方法更好。但考慮到你試圖填充2個數組,我會採取兩次旅行。但是,那麼爲什麼你需要兩個數組。如果一組數據包含您需要呈現的所有內容,那麼爲什麼要分成兩個數組?你可以使用控制中斷邏輯並迭代「訂單」,然後在「更改」時寫出新的標題,然後遍歷細節。 (基本上忽略「訂單」信息,直到它改變) – xQbert

回答

1

您可以使用下面的while循環來填補你的陣列:

$data = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    if (!isset($data[$row['order_id']])) { 
     $order = array('order_id' => $row['order_id'], 
         'order_date' => $row['order_date'], 
         /* ... */ 
         'orderdetails' => array()); 
     $data[$row['order_id']] = $order; 
    } 
    if (isset($row['order_details_id'])) { // or is it "!= null"? don't know... 
     $details = array('id' => $row['order_details_id'], 
         'whatever' => $row['order_details_whatever']); 
     $data[$row['order_id']]['orderdetails'][] = $details; 
    } 
} 

這種方式,您可以有多個ORDERDETAILS爲一個訂單,他們得到全部加到['orderdetails']領域。

其他注意事項: