2016-04-03 11 views
0

私は、結果を配列に入れることを心がけています。 orderorderdetailsLEFT 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;"; 

私はこのデータを返すAN次の形式の配列でそれらを配置する方法を発見しようとしています:

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

EDIT:上記の機能は、複数の注文詳細を考慮していませんが、その機能は一例です。

簡単な方法がありますか、これについてはより良いクエリを使用できますか?あなたの配列を埋めるためにループしながら、次のように使用することができます

+0

2つのアレイが必要な場合は、データベースに2回移動します。注文のために1回、それらの注文の詳細のために1回。あなたが修正しようとしているスプリットの問題を引き起こして左に参加することによって。 – xQbert

+0

さて、私は、パフォーマンスの観点から、PHPとMySQLに2つのクエリの代わりに1つのクエリを処理させることが2つのクエリより優れていると推測しましたか? – Abayob

+0

個人的には、私は仕事が必要なデータセットを手に入れたことが分かりました。ここでの完全なユースケースを知らないと、どのアプローチが優れているかは言えません。しかし、あなたが2つの配列を設定しようとしているとすれば、私は2回の移動を行います。しかし、なぜ2つの配列が必要ですか? 1つのデータセットにレンダリングする必要があるものがすべて含まれている場合、なぜ2つの配列に分割するのですか?コントロールブレークロジックを使用して、「注文」を繰り返してから、「変更する」ときに新しいヘッダーを書き出し、詳細を繰り返し実行することができます。 (基本的に "注文"の情報は変更されるまで無視されます) – xQbert

答えて

1

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

あなたは1つの注文の複数たOrderDetailsを持つことができます。この方法は、それらがすべて['orderdetails']フィールドに追加されます。

その他の注意事項:

  • 質問What is the reason not to use select *?とこのトピックに関する他のウェブサイトを参照して、SELECT *を使用しないでください。
  • 関数を使用しないでください(上記のwhileループの表示に関わらず)deprecatedです。代わりにPDOを使用してください。
関連する問題