MySQL总结了关系数据库中的数字

时间:2014-08-08 16:43:22

标签: php mysql sql database

我正在制作一个Web应用程序,以便客户订购用于antyhing的商品。为此,我创建了一个MySQL数据库,其中包含以下表格:

  • customers
  • orders
  • order-items
  • products

customers表格中有关于此人的所有信息,例如:

  • 客户ID,主键和自动增量(id)
  • 第一个名字(first_name)
  • 姓氏(last_name)
  • 电子邮件地址(email_adress)
  • 有关客户的信息(customer_info)

示例:

enter image description here

orders表中有关于它的所有具体信息,例如:

  • 订单ID,主键和自动递增(id)
  • 它订购的客户,与id表(customer_id)中的customers字段相关联
  • 订单信息(order_info)
  • 订单需要转到的位置(位置)
  • 创建(创建)订单时

示例:

enter image description here

order-items表中,每个客户订购的所有商品都是由上一张表中的order-id链接的。

  • 主键和自动增量的ID,不用于任何关系(id)
  • 用于产品的订单ID适用于订单。这与id表(order_id)
  • 中的orders字段相关联
  • 产品ID,用于订购的产品,与products表中的id字段相关联。 (产品)
  • 他们订购的产品数量(数量)

示例:

enter image description here

products表格中有关于产品的所有信息:

  • 主键和自动递增的ID,与product_id表(id)
  • 中的order_items字段相关联
  • 产品名称(名称)
  • 产品说明(说明)
  • 产品价格(价格)

示例:

enter image description here

问题

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_idproduct_id的实际价格联系起来?那么我可以乘以数量。

然后用相同的order_id

总结所有这些值

对于第一个订单,我们得到产品2(数量3)和产品3(数量5),这应该加上2.50 * 3 + 3.00 * 5 = 22.50

2 个答案:

答案 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

希望这很清楚,但如果没有,请留下更多评论,我会在今晚或明天进一步解释。