0

好的,我有 3 个表,其中一个包含产品,一个包含订单,并使用订单 ID 和产品 ID 连接表以将产品与订单相关联。

但是我如何设置一个查询来选择并返回所有订单以及每个订单中的项目。所以我最终在每一行都有一列 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 

对于订单中的每个项目。

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

4

2 回答 2

0

假设您的表是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订单编号在哪里。

于 2012-04-20T09:27:00.297 回答
0

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

如果您需要简单地显示每个订单中的商品数量等简单信息,您可以通过一个查询轻松检索所有这些信息。

但是,如果您需要在每个订单中显示有关商品的详细信息(例如商品、数量、价格),则执行第二次查询会更容易,检索商品信息。第二个查询可以对每个订单执行一次,也可以对所有显示的订单执行一次(使用显示的订单 ID 创建一个数组,并使用该IN子句选择属于这些 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
         }
    }
}
于 2012-04-20T09:35:16.440 回答