【问题标题】:MYSQL reference to another table fieldsMYSQL 引用另一个表字段
【发布时间】:2015-07-05 21:10:57
【问题描述】:

我正在尝试获取特定时间段内售出的产品数量。对于此示例: products 表有一个数量字段,每当销售特定产品时该字段就会增加。订单表有开始日期和结束日期。有没有办法我可以在我的订单表中保存产品表(如对象)的引用,以便我可以看到每个产品在每个开始日期的销售量?一个简单的例子:我有 2 种产品: 1 bike 25000 32 sportbike 30000 5 已为我的约会对象出售。因此,订单将类似于:1 05.07.2015 05.07.2015 和那些产品。

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name varchar(20),
    price float,
    quantity integer,
);

CREATE TABLE sells (
    sell_id integer PRIMARY KEY,
    start_date date,
    end_date date    
);

//新思路:

CREATE TABLE products (
        product_no integer PRIMARY KEY,
        name varchar(20),
        price float
    );

CREATE TABLE sells (
        sell_id integer PRIMARY KEY,
        date date,
        quantity integer,
        product_id integer FOREIGN KEY 
    );

【问题讨论】:

  • 您的意思是像OrderLines 表,其中包含order_idproduct_noquantityprice?该表可以保存每个订单销售的产品,然后您可以查询哪些产品在哪些日期销售。不过,我并没有真正得到开始日期和结束日期。我认为产品订单只有一个日期。
  • 是的。这些日期的重点是我需要查看每天售出多少 x 和 y 产品。如果你能给我一个更好的想法如何做到这一点,我将不胜感激。
  • 我想我刚刚做到了。 :) 对我来说,订单是您订购产品的一个时刻,其中包含日期和可能对客户的引用。 OrderLine 包含该订单和产品之间的链接。如果客户订购多个产品,则一个订单可以有多个 OrderLine。要获得当天售出的产品,请编写一个查询以获取当天的所有订单(或某个日期范围内的所有订单),并将订单加入订单行,以便对每个产品求和。我会在答案中添加这个,但我现在只是在暗示一个解决方案,因为我不确定我是否完全理解这个问题。
  • 我想你明白了。我需要知道每种产品已售出哪些产品以及每种产品的数量。请发布答案:)
  • 我认为您需要描述 prod.qty 的含义,并且您需要 @GolezTrol 的 OrderLines 表 desc 否则这没有意义。订单没有意义

标签: mysql


【解决方案1】:

除非订单总是针对单一产品,否则我认为您将需要第三张桌子。对我来说,这种情况下的最小 *) 数据模型如下所示:

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name varchar(20) not null,
    price float,
    quantity_on_stock integer not null
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    order_date date not null
);

CREATE TABLE orderlines (
    order_id integer not null REFERENCES orders.order_id,
    product_no integer  REFERENCES products.product_no,
    price integer,
    quantity integer not null,
    PRIMARY KEY(order_id, product_no)
);

那么,在某个时期内获得销售额的查询可能如下所示:

select
  p.product_no,
  p.name,
  sum(ol.quantity)
from
  products p
  inner join orderlines ol on ol.product_no = p.product_no
  inner join orderlines o on o.order_id = ol.order_id
where
  ol.order_date between :start_date and :end_date

*) 我说的是最小化,但实际上它并没有最小化。您可能还想存储发票,或者至少存储某种指示订单是否实际付款和交付的指示,因为有时订单会被取消,或者只是等待打开。

【讨论】:

  • 我不知道内部联接是做什么的,因为我是 mysql 新手。但是我最后的评论不是和这里一样吗?你写的最后一部分?
  • 另一个问题是,如果那天实际上是在表格的底部并且我有大约 100k 行,是否需要很长时间才能给我一天的总销售量?我该如何防止呢?
  • 表和可以将表数据组合成您可能需要的表单的查询之间存在差异,在表中,您实际存储的数据尽可能结构化(并且冗余尽可能少)一个特定的时间。因此,要获得产品总销售额,您可以使用查询将它们从订单和订单行中读取单个销售额,例如,将它们汇总为每个产品的总销售额。那个查询结果是根据表日期计算出来的,但它本身不是表数据,不存入数据库。
  • 您可以使用表上的索引来加速这些查询,但那是完全不同的故事。如果您有具体的实施问题,最好遵循一些教程并返回。
【解决方案2】:

您肯定想要一个 sales 表格来显示销售的物品和时间,而不是显示正在运行的库存的表格。

在 SQL 中聚合详细信息以创建运行总计比从运行总计中重建详细信息要容易

因此,如果您碰巧有一个 sales 表,其中包含 product_idquantityts 的列(销售的时间戳),那么您可以获得以下内容的摘要product_id 的销售额和这样的销售日期。

SELECT product_id,
       DATE(ts) AS salesdate,
       SUM(quantity) AS quantity
  FROM sales
 WHERE ts >= :start_date
   AND ts < :end_date + INTERVAL 1 DAY
 GROUP BY DATE(ts), product_id

其中一件很酷的事情是您可以在此表中添加transaction_type 的列。如果客户退回产品,您将其标记为return 并使用负数量。如果您的商店收到一批产品,您将其标记为restock 并使用负数量。然后,如果您想显示净销售额——销售额减去退货产品——只需对查询进行一个小改动。

SELECT product_id,
       DATE(ts) AS salesdate,
       SUM(quantity) AS quantity
  FROM sales
 WHERE ts >= :start_date
   AND ts < :end_date + INTERVAL 1 DAY
   AND transaction_type IN ('sale', 'return')
 GROUP BY DATE(ts), product_id

如果您想知道在特定 end_date 内每种产品的库存量,您可以这样做(从时间开始)。

SELECT product_id,
       SUM(quantity) AS quantity
  FROM sales
 GROUP BY product_id

在实际的库存/销售系统中,通常每年盘点一次,关闭上一年的销售表,并为每个产品重新开始一个起始值。通过sales_ordersales_detail 组织销售也很常见,这样您就可以跟踪每笔交易中多件商品的销售情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多