好的我有3个表,其中包含产品,其中一个包含订单,并与订单ID和产品ID连接,以便将产品与订单相关联。
但是如何设置一个查询来选择并返回所有订单以及每个订单中的项目。所以我最终在每行中都有一个list 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
订单中的每件商品。
我知道我需要做某种子查询,但请注意如何构建它。
答案 0 :(得分:0)
假设您的表格为PRODUCT
,ORDER
且加入表PRODUCTORDER
包含密钥product_id
和order_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。
答案 1 :(得分: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
}
}
}