MYSQL引用另一个表字段

时间:2015-07-05 21:10:57

标签: mysql

我试图在特定的时间段内获得销售的产品数量。对于此示例: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 
    );

2 个答案:

答案 0 :(得分:0)

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

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

*)我说最小,但它实际上不到最小。您可能也想存储发票,或者至少是某种指示,表明订单是否实际支付和交付,因为有时订单被取消,或者只是等待开放。

答案 1 :(得分:0)

您肯定希望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组织销售也很常见,因此您可以跟踪每笔交易中多件商品的销售情况。