2012-10-16 45 views
0

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

例如:

客户可以在一个订单购买“IPAD”。但是,如果他们购买“Ipad”和“Android”作为捆绑销售,他们将获得50%的折扣,并且可以省钱。在这种情况下,我们将获得1个订单下的两个产品。但是,顾客将作为一种产品支付(即120美元)。为了正确分配订单,我们为额外的产品创建了一个额外的行(如果产品两个)。如果包含三个产品,它将分别在“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  [email protected]    1 Ipad 

3 20   12/6/2011  [email protected]    1 Android 
1 40   10/5/2011  [email protected]    2 Laser hair remover 

要求的结果:

删除重复顺序ID

Id order_price purchase_date  email  qty   name 
    3 20   12/6/2011  [email protected]    1 Ipad 


    1 40   10/5/2011  [email protected]    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 [email protected] aa 
2 [email protected] bb 
3 [email protected]   cc 
4 [email protected] dd 
5 [email protected] ee 
6 [email protected] ff 
7 [email protected]   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级和查询会忽略其他多余的行

回答

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

+0

太棒了。谢谢 – Anam

+0

嗨Jhone,请解释以下部分“MIN(Product_ID)prodID FROM product_orders”pls。这将帮助我很多。谢谢 – Anam

+0

子查询获得每个orders_id的产品ID的最小值。运行这个'SELECT orders_id,MIN(Product_ID)prodID FROM product_orders GROUP BY orders_id',您将设置结果。 –

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订单。ID

1

只有一个产品需要三个新表:

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_Orders表,其中填充Product_ID的OrderLines表中的每个产品以及ProductLines.BundleID填充后的BundleProducts表中的每个ProductID都填充Product_Orders表。

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

当订单完成后,你会做这样的事情:

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 
+0

非常感谢你。这将帮助我很多。我将与我的团队讨论这个问题。我越来越喜欢这个网站。真棒。 – Anam