2015-05-08 28 views
-1

我們有3張桌子。如何正確選擇幾個一對多的行?

1)訂單

PK

ORDER_ID

2)Order_Products

PK | FK |列| Column

order_product_id | order_id | product_id |名稱|數量

3)Order_Product_Components

PK | FK |列|列| Column

order_product_component_id | order_product_id | stock_id |名稱|數量


表2和表3具有一對多的關係。

因此,如果我們想要使用它們的組件獲得訂購產品數組,我們可以使用哪種最佳查詢?

最後的結果應該是這種格式(如果我們有1種產品有兩種成分):

$products = array(
    array(
    ' 'product_id' => x, 
     'name'  => x, 
     'quantity' => x, 
     'stocks'  => array(
       array(
        'stock_id' => x, 
        'name'  => x, 
        'quantity' => x), 
       array(
        'stock_id' => x, 
        'name'  => x, 
        'quantity' => x))); 
+0

據我所知,MySQL將返回一行數組。我不認爲有什麼辦法可以做一個嵌套數組。您需要使用多個查詢來檢索數據並在代碼中生成結果。 – CargoMeister

+0

只是fyi,你不能用1查詢從sql中取出多維數組。訂單數據需要1個,訂單附加的項目需要1個。 – castis

+0

我明白這一點。所以我的問題是做這件事的最好方法是什麼?分組,加入,...? –

回答

0

由於訂單是保留字我已經改變了順序表名「訂單」。我正在使用連接來獲得預期的結果。我認爲,按照你想要的方式得到結果是不會有用的。

$sql= "select * from orders o join order_products op on o.order_id=op.order_id"; 
    $stmt = $db->prepare($sql); 
    $stmt->execute(); 
    $orders =$stmt->fetchAll(); 


    foreach($orders as $o){ 
    $sql= "select stock_id,name,quantity from order_products op 
      join order_product_components opc on opc.order_product_id=op.order_product_id where op.order_product_id=:orderprodid"; 
    $stmt = $db->prepare($sql); 
    $stmt->execute(array('orderprodid'=>$o['order_product_id'])); 
    $comps =$stmt->fetchAll(); 
    $o['stocks']=$comps; 
    } 
+0

除非卡米爾實際需要從中其他未說明的數據,在引用'順序[S]'不需要表。只要使用'WHERE op.order_id'就足夠了,並且會減少連接的數量。 – Uueerdo

0

您可能不想做一個循環的查詢,這可能會非常昂貴。

只是做一個查詢通過加入結果所有表和訂購產品編號,產品名稱,...股票編號,股票名稱,...和循環,建立自己的陣列中的一個通行證。