我正在尝试查询下表,根据每件商品有30天库存的时间给我一个开始日期和结束日期。 (库存不连续)
例如,如果我在过去的40天中有30个物品有库存,那么我将有第一个日期物品库存和物品存货的最后一天,当我们达到30天。结束日期应尽可能接近今天。我知道我可以在PHP代码中执行此操作,但表格会变大并且很难存储在内存中。
这在sql中是否可行?
CREATE TABLE phppos_inventory_stock_log (
id int(10) NOT NULL AUTO_INCREMENT,
in_stock int(1) NOT NULL DEFAULT '0',
date date NOT NULL,
item_id int(10) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY in_stock (item_id,in_stock,date)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
mysql> select * FROM phppos_inventory_stock_log;
+----+----------+------------+---------+
| id | in_stock | date | item_id |
+----+----------+------------+---------+
| 1 | 1 | 2018-03-10 | 2 |
| 2 | 1 | 2018-03-11 | 2 |
| 3 | 1 | 2018-03-12 | 2 |
| 4 | 1 | 2018-03-13 | 2 |
| 5 | 1 | 2018-03-10 | 1 |
| 6 | 0 | 2018-03-11 | 1 |
| 7 | 1 | 2018-03-12 | 1 |
| 8 | 1 | 2018-03-13 | 1 |
在以上示例中,库存商品项目ID为3天,其开始日期为2018-03-11至2018-03-13,商品ID为2018-03-10至2018-03-13
答案 0 :(得分:0)
如果我正确理解了这个问题,你需要一个项目库存为30x的日期。
首先,我们需要找到最新日期,当商品有库存时max(date)
,然后我们为每个商品选择,当我们有库存时,按天数排序,我们限制为我们感兴趣的范围(30天)并选择最早的日期。
SELECT max(`date`) AS max_date, item_id,
(SELECT MIN(`date`)
FROM phppos_inventory_stock_log AS chsl
WHERE chsl.item_id = psl.item_id
AND in_stock = 1
ORDER BY `date` DESC
LIMIT 30) AS min_date
FROM phppos_inventory_stock_log AS psl
WHERE in_stock = 1
GROUP BY item_id
注意:如果您有大量数据,则会终止数据库。限制返回结果的数量或检索特定item_id
的列表。