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