2016-04-03 27 views
0

Sonuçları bir diziye eklemeyi tercih ettiğim bir sorgum var. order ve orderdetails:PHP'de sonuçları bir LEFT JOIN mysql sorgusuyla kolayca nasıl bölerim?

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;"; 

bu verileri döndürür bir aşağıdaki biçimde bir dizi koymak için nasıl bulundu çalışıyorum:

$aOrders = array(
0=>array(Orders.parameter1=>value, orders.parameter2=>value, orders.parameter3=>value, 'orderdetails'=>array(
    array(Orderdetails.parameter1=>value, orderdetails.parameter2=>value))); 
sorgu tüm iki tablo verisini geri

Şu anda her sonucu bir yardımcı dizi olarak döndürüyorum ve her değişkeni 2 tuş dizisini kullanarak ismine göre manuel olarak bölüyorum, ancak bu çok 'emek yoğun' görünüyor mu?

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; 
     } 
    } 
} 

DÜZENLEME: işlev yukarıdaki dikkate çoklu sipariş ayrıntıları almaz, ancak işlevi bir örnek olarak içindir!

Daha kolay bir yol var mı, yoksa bunun için daha iyi bir sorgu kullanabilir miyim? döngü dizinizi doldurmak için ise

+0

İki diziyi isterseniz, veritabanına 2 kez gidin. Emirler için bir kez, bu emirlerin ayrıntıları için bir kez. Düzeltmeye çalıştığınız bölünmüş soruna neden olarak ayrılmadan önce. – xQbert

+0

Eh, performans ve bilge PHP ve MySQL'in 2 yerine bir sorgu ele almasının 2 sorgudan daha iyi olduğunu tahmin ettim. – Abayob

+0

Şahsen, birlikte çalışmam gereken veri setini buluyorum, artık daha kolay değil. Tam kullanım durumunu bilmeden burada hangi yaklaşımın daha iyi olduğunu söyleyemem. Ama 2 diziyi doldurmaya çalıştığın için iki yolculuk yapacağım. Ama o zaman neden iki diziye ihtiyacınız var? Eğer bir veri kümesi, işlemek için ihtiyacınız olan her şeyi içeriyorsa, neden iki diziye bölünür? Kontrol molası mantığını kullanabilir ve "emirleri" olsa da yineleyebilir ve sonra "değiştirir" ve yeni bir başlık yazdığında detayları tekrarlayın. (temelde "sipariş" bilgisini değişene kadar görmezden gelir) – xQbert

cevap

1

Aşağıdaki kullanabilirsiniz:

$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; 
    } 
} 

Bu şekilde tek bir sipariş için birden ORDERDETAILS olabilir, hepsi ['orderdetails'] alanına eklenir olsun.

ek notlar:

  • , SELECT * kullanmak soruyu What is the reason not to use select *? ve bu konu hakkında başka bir web sitesine bakın vermeyin.
  • mysql_*() işlevlerini kullanmayın (while döngüsünü göstermek için yukarıda yaptığım gibi), bunlar deprecated. Bunun yerine PDO kullanın.