我正在制作一个Web应用程序,以便客户订购用于antyhing的商品。为此,我创建了一个MySQL数据库,其中包含以下表格:
customers
orders
order-items
products
在customers
表格中有关于此人的所有信息,例如:
示例:
在orders
表中有关于它的所有具体信息,例如:
id
表(customer_id)中的customers
字段相关联示例:
在order-items
表中,每个客户订购的所有商品都是由上一张表中的order-id
链接的。
id
表(order_id)orders
字段相关联
products
表中的id字段相关联。 (产品)示例:
在products
表格中有关于产品的所有信息:
product_id
表(id)order_items
字段相关联
示例:
问题
Bob命令product_id
2次,3次。这是三明治的牛肉,价格为2.50
,我们必须乘以3,因为它已被订购3次。这是7.50
鲍勃还订购了product_id
3次,5次。这是三明治的鸡肉,价格为3.00
,我们必须乘以5,因为它已被订购5次。 Wich出现在15.00
现在我需要总结一下。这是15.00 + 7.50 = 22.50
问题
如何将product_id
与product_id
的实际价格联系起来?那么我可以乘以数量。
然后用相同的order_id
对于第一个订单,我们得到产品2(数量3)和产品3(数量5),这应该加上2.50 * 3 + 3.00 * 5 = 22.50
答案 0 :(得分:2)
你问," 如何将product_id与product_id的实际价格相关联?然后我可以乘以数量...然后用相同的order_id对所有这些值求和。"
像这样:
SELECT OI.Order_ID, Sum(OI.Quantity * P.Price) Total_Price
FROM `order-items` OI
INNER JOIN Products P
on OI.Products_Id = P.ID
GROUP BY OI.Order_ID
有问题的样本数据的预期输出:
ORDER_ID Total_price
1 22.50
这就是我询问样本输出的原因。我不确定您要返回哪些列,所以我只返回每个订单的总和。
现在说的是什么 为显示订单ID的每个订单返回一行,并为(订购数量*为该订单的所有行定价的总和)返回一行。
这是通过查看订单项目表来完成的(因为我不确定mySQL是否喜欢名称中的短划线( - ))。根据订购商品表和价格表之间的product_Id加入这些表。然后按顺序项对结果进行分组,允许总和将订单的所有行聚合在订单该行的项目价格上。
答案 1 :(得分:1)
您可以构建一个包含每个订单总计的中间表,然后将其与订单表一起加入以获取该订单的customerID,您与客户一起获取客户名称
SELECT C.FirstName, C.LastName, Totals.Order_ID, Totals.NetCost
FROM (SELECT OI.order_id, SUM(OI.quantity * P.price) as NetCost
FROM orderitems as OI INNER JOIN products as P ON OI.products_id = P.id
GROUP BY OI.order_id
) as Totals
INNER JOIN orders as O on O.ID = Totals.order_id
INNER JOIN customers as C on C.ID = O.customer_id
@xQbert所讨论的问题是,如果您的客户在星期一下订单,您在星期二提高价格,并在星期三运行此报告,报告将显示与客户在他看到的时间不同的报告。批准了订单。更好的设计是按订单存储订单价格,或者至少按订单存储订单价格,以便随后的价格变化不会影响历史订单。如果客户想要退还一件商品,前者会更好。
编辑:我的意思是@xQbert在他的评论中提到的问题,他的回答是在我的前面提到但是我在刷新时错过了它
编辑2:根据@Bas
的要求提供更多解释最容易从内部考虑这个问题并向外工作,所以让我先从获取物品的价格开始。
我想将orderitem中的项目与它的价格链接起来,所以JOIN orderitem(我给它一个OI的别名)到产品ID(我给出别名P)。产品ID在OrderItem中称为products_id,但只是产品中的ID。
有了这个,我可以将产品的价格乘以OrderItems中的数量,以获得该商品的成本
因为我想要每个订单的所有内容的总和,我在这个子查询中使用GROUP BY子句,我正在通过order_id进行分组。使用GROUP BY,您通常会使用您正在分组的字段,以及一些“聚合”字段,您可以在其中获取总和,或最大值,或平均值,或其中任何一个,并且它是所有行的总和或其他内容属于同一群体。
所以此时我们在括号内定义了查询。我把它命名为Totals,它就像一个真正的表,但是当你的查询结束时它会消失。
下一步是将这个“总计”表与您的订单表结合起来,这样我们就可以查找客户ID,然后将其与客户相结合,这样我们就可以查找客户名称。我为客户和订单(分别为C和O)使用了别名,但它们不是必需的。事实上,如果不是所有的别名,这可以被重写。我认为它使它更具可读性,但如果它们让你感到困惑,你可以使用以下代码,它也是一样的。我觉得Totals是必要的,但也许不是那样。
SELECT FirstName, LastName, Totals.Order_ID, Totals.NetCost
FROM (SELECT order_id, SUM(quantity * price) as NetCost
FROM orderitems INNER JOIN products ON products_id = products.id
GROUP BY order_id
) as Totals
INNER JOIN orders on orders.ID = Totals.order_id
INNER JOIN customers on customers.ID = orders.customer_id
希望这很清楚,但如果没有,请留下更多评论,我会在今晚或明天进一步解释。