【问题标题】:Extract Unique Orders提取唯一订单
【发布时间】:2012-10-16 08:51:59
【问题描述】:

请帮助我编写一个 SQL 查询以从下表中提取唯一订单。为此,我准备了一个 SQL 查询。它工作正常,但在某些地方它返回一些重复的行,因为一些订单有多个产品。

例如:

客户可以在一个订单中购买“IPAD”。但是,如果他们捆绑购买“Ipad”和“Android”,他们将获得 50% 的折扣,并且可以省钱。在这种情况下,我们将在 1 个订单下获得两种产品。但是,客户将作为一种产品付款(即 120 美元)。为了正确分配订单,我们为额外的产品创建了一个额外的行(如果产品有两个)。如果 bundle 包含三个产品,它将在“product_orders”表中分别创建三行。

多个产品的示例“product_orders”表:

id orders_id product_id qty
 1   3      2         1
 2   2      1         1
 3   3      3         1

请查看上面的示例表,捆绑订单的一个 order_id 复制了两次。 如果我们能够提取一个订单信息,我们将获得整个捆绑信息。所以,我们不需要额外的行。

我应用的查询:

Select 
    orders.id, 
    orders.order_price, 
    orders.purchase_date,
    customers.email, 
    product_orders.qty, 
    products.name 
from 
    orders 
    INNER JOIN product_orders on orders.id=product_orders.orders_id 
    INNER JOIN products on product_orders.product_id=products._id 
    INNER JOIN customers on orders.customer_id =customers.id

Result of the above query:**

Id  order_price  purchase_date      email        qty         name 
3  20         12/6/2011     aa@gmail.com             1   Ipad

3  20         12/6/2011     aa@gmail.com             1   Android
1  40         10/5/2011     bb@gmail.com             2  Laser hair remover

要求的结果:

删除重复的订单 ID

Id  order_price  purchase_date      email        qty         name 
    3  20         12/6/2011     aa@gmail.com             1   Ipad


    1  40         10/5/2011     bb@gmail.com             2  Laser hair remover

表 1:订单

id  customer_id order_price purchase_date
1   1                   0.20    12/6/2011
2   2                   0.20    12/6/2011
3   1                   0.20    12/6/2011
4   1                   0.20    12/6/2011
5   1                   0.20    12/7/2011
6   3                   199.00  12/7/2011
7   4                   199.00  12/7/2011
8   5                   199.00  12/7/2011
9   6                   199.00  12/7/2011
10  7                   199.00  12/7/2011

表 2:客户

id  email                   name
1   aa@dealboard.com.au aa
2   bb@dealboard.com.au bb
3   cc@live.com.au          cc
4   dd@acgglobal.com    dd
5   ee.heinrich@det.nsw.edu.au  ee
6   ff@optusnet.com.au  ff
7   ssy@hotmail.com         ss

表 3:产品

id  name
1   A Home Portable Laser Hair Remover
2   Ipad
3   android
4   Asus
5   s
6   10 inch Android
7   A Fabric Steamer Cleaner
8   A Magnetic Fly Screen Door
9   pillopw
10  LCD

表 4:product_orders

id orders_id product_id qty
    1   1      1         1
    2   3      3         1
    3   3      4         1
    4   4      1         1
    5   4      2         1
    6   6      1         1
    7   7      1         1
    8   4      2         1
    9   4      3         1
    10  10     1         1

请帮我从“product_orders”表中只提取 1 个订单,查询将省略其他额外的行

【问题讨论】:

    标签: php mysql sql join


    【解决方案1】:

    添加额外的subquery,每个order_id 只能获得一个产品

    Select 
        orders.id, 
        orders.order_price, 
        orders.purchase_date,
        customers.email, 
        product_orders.qty, 
        products.name 
    from 
        orders 
        INNER JOIN product_orders on orders.id=product_orders.orders_id 
        INNER JOIN
        (
            SELECT orders_id, MIN(Product_ID) prodID
            FROM product_orders
            GROUP BY orders_id
        ) c ON product_orders.orders_ID = c.orders_id AND
                product_orders.Product_ID = c.prodID
        INNER JOIN products on product_orders.product_id=products.id 
        INNER JOIN customers on orders.customer_id =customers.id
    

    SQLFiddle Demo

    【讨论】:

    • 嗨 Jhone,请解释以下“MIN(Product_ID) prodID FROM product_orders”部分。这对我有很大帮助。谢谢
    • 该子查询获取每个 orders_id 的产品 ID 的最小值。运行此SELECT orders_id, MIN(Product_ID) prodID FROM product_orders GROUP BY orders_id,您将设置结果。
    【解决方案2】:

    您需要三个新表:

    Bundles (ID, Name)
    
    BundleProducts (BundleID, ProductID)
    
    OrderLines (ID, OrderID, ProductID, BundleID, Qty)
    

    假设捆绑包包含:

    ID    Name
    1     IPad & Android
    

    并且BundleProducts包含

    BundleID    ProductID
    1           2
    1           3
    

    然后,当客户将产品添加到他们的订单中时,您将 ProductID 插入 OrderLines 表中。如果他们添加了一个 Bundle,您将插入到 BundleID 中。订单完成后,您可以使用填充了 Product_ID 的 OrderLines 表中的每个产品填充 Product_Orders 表,如果填充了 ProductLines.BundleID,还使用 ​​BundleProducts 表中的每个 ProductID。

    或者,您可以将捆绑包制作成产品本身。这意味着您不需要 Bundles 表,但仍需要 BundleProducts 表。您也不需要 OrderLines 中的 BundleID 列。因此,“Ipad & Android Bundle”成为 Products 表中的新产品。

    订单完成后,您会执行以下操作:

    INSERT INTO 
        Product_Orders (Orders_id, Product_ID, Qty)
    SELECT
        Orders.ID,
        COALESCE(BundleProducts.ProductID, OrderLines.ProductID),
        OrderLines.Qty
    FROM
        Orders
        INNER JOIN OrderLines ON Orders.ID = OrderLines.Orders_ID
        LEFT JOIN BundleProducts ON OrderLines.ProductID = BundleLines.BundleID
    

    【讨论】:

    • 非常感谢你。这对我有很大帮助。我将与我的团队讨论这个问题。我越来越喜欢这个网站。太棒了。
    【解决方案3】:
    Select orders.id, orders.order_price, orders.purchase_date, customers.email, product_orders.qty, products.name 
    from orders 
    INNER JOIN product_orders on orders.id=product_orders.orders_id 
    INNER JOIN products on product_orders.product_id=products._id 
    INNER JOIN customers on orders.customer_id =customers.id
    GROUP BY orders.id
    

    在 GROUP BY orders.id 中添加

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多