提取唯一订单

时间:2012-10-16 08:51:59

标签: php mysql sql join

请帮我编写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个订单,查询将省略其他额外行

3 个答案:

答案 0 :(得分:2)

添加额外的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

答案 1 :(得分:1)

您需要三个新表:

Bundles (ID, Name)

BundleProducts (BundleID, ProductID)

OrderLines (ID, OrderID, ProductID, BundleID, Qty)

让我们说Bundles包含:

ID    Name
1     IPad & Android

BundleProducts包含

BundleID    ProductID
1           2
1           3

然后,当客户将产品添加到他们的订单时,您将ProductID插入OrderLines表。如果他们添加了Bundle,则插入BundleID。订单完成后,您将使用OrderLines表中填充Product_ID的每个产品填充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

答案 2 :(得分:0)

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