【问题标题】:Mysql How to select all orders and the items within the ordersMysql如何选择所有订单和订单中的项目
【发布时间】:2012-04-20 09:20:40
【问题描述】:

好的,我有 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 

对于订单中的每个项目。

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

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    假设您的表是 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 是订单 ID。

    【讨论】:

    • 我实际上不需要从产品表中选择任何内容,因为连接表中包含产品标题和产品 ID。但这看起来是正确的
    【解决方案2】:

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

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

    但是,如果您需要在每个订单中显示有关商品的详细信息(例如商品、数量、价格),则执行第二次查询以检索商品信息会更容易。 第二个查询可以针对每个订单执行,也可以只针对所有显示的订单执行一次(使用显示的订单 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
             }
        }
    }
    

    【讨论】:

    • 上述哪种情况更适合您的问题?我不知道你在什么情况下需要这个例子。
    • 每个订单案例中商品的详细信息
    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2021-12-05
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多