Mysql如何选择所有订单和订单中的项目

问题描述:

好吧我有3个表格,其中包含产品,其中一个带有订单,并与订单ID和产品ID联接表以将产品与订单相关联。Mysql如何选择所有订单和订单中的项目

但是,如何设置一个查询来选择并返回所有订单以及每个订单中的项目。所以我最后在每一行都有一个列order_items。

到目前为止,我有:

SELECT 
    intOrderID AS Order_ID, 
    strPaymentMethod AS Payment_Method, 
    strPaymentRef, AS Payment_Ref, 
    strPaymentStatus AS Payment_Status, 
    dtmDate AS Date, 
    curPaymentAmount AS Net_Price, 
    curShippingFee AS Shipping_Fee 
FROM tbl_mod_ShopOrders 

其他表是tbl_mod_ShopOrderItems,我需要选择

intProductID 
strProductTitle 
curPrice 
intQty 

为订单中的每个项目。

我知道我需要做某种子查询,但请注意如何构造它。

假设你的表是PRODUCTORDER和连接表PRODUCTORDER具有键product_idorder_id,您可以:

SELECT o.id, GROUP_CONCAT(po.product_id) AS products_list 
FROM PRODUCT p, PRODUCTORDER po 
WHERE o.id = po.order_id 
GROUP BY o.id 
ORDER BY o.id 

作为聚合函数使用GROUP_CONCAT。以上结果,例如:

id | products_list 
---|-------------- 
01 | 1,4,9 
02 | 2,4,6 
03 | 5 
04 | 3,5 

其中id是ORDER ID。

+0

我实际上并不需要的时候从产品表中选择任何东西,因为连接表具有产品标题和产品ID。但看起来沿着正确的路线 – user794846 2012-04-20 09:33:10

每个订单都有几个项目。这意味着当您选择订单时,每行可以有一个或多个项目。

如果您需要简单地显示每个订单中的项目数量等简单内容,则可以使用一个查询轻松检索所有信息。但是,如果您需要显示每个订单中商品的详细信息(例如商品,数量,价格),那么执行第二个查询,检索商品信息会更容易。 第二个查询可以针对每个订单执行,或者对于所有显示的订单仅执行一次(使用IN子句创建一个包含显示的订单id并且选择属于这些id的所有项目的数组)。

举例详细情况:

//$orders = array of orders retrieved by your query 

// loop through the orders to collect all ids 
$order_ids = array(); 
foreach($orders as $order) { 
    $order_ids[] = $order->Order_ID; 
} 

// build the select to retrieve all items 
$items = array(); 

// make the select only if there are orders available 
if(count($order_ids) > 0) { 
     $q = "SELECT * from tbl_mod_ShopOrderItems WHERE order_id IN (" . implode(',', $order_ids) . ") "; 
     // ... 
     // assign result to $items 
} 

后来,显示订单,您可以依次通过$items并检查order_id符合当前order

foreach($orders as $order) { 
    // ... 
    // display order info 

    // display order items 
    foreach($items as $item) { 
     // if the item belongs to the current order 
     if($item->order_id == $order->order_id) { 
      // ... 
      // display the current item 
     } 
    } 
} 
+0

有一个例子吗? – user794846 2012-04-20 09:43:35

+0

上述哪种情况适合您的问题?我不知道你是否需要这个例子。 – 2012-04-20 09:45:31

+0

关于每个订单案例中的项目的详细信息 – user794846 2012-04-20 09:52:46