我一直在努力进行查询,我不确定它是否可能在纯 sql 中或需要 php 支持。
基本上我想生成一个订单报告,列出系统中超额预订的产品。
表结构:
订单
id int
bookingStart DATETIME
bookingEnd DATETIME
order_lines
id int
qty int
product_id int
booking_id int
产品
id int
stock int
一个订单可以包含具有相同产品的多行。因此,订单上的每个产品都需要有一个 SUM。有没有人对实现这一目标的最佳方法有任何建议?
我尝试使用子查询在特定时间间隔内循环,但它没有考虑不同预订之间的重叠,如果可以通过单个查询完成,我有点卡在这里:
SELECT (SELECT SUM(lin2.qty) FROM booking_lines lin2,orders b2
WHERE
lin2.product_id=e.id AND
b2.id=lin2.booking_id AND (
(b2.bookingStart BETWEEN b1.bookingStart AND b1.bookingEnd) OR
(b2.bookingEnd BETWEEN b1.bookingStart AND b1.bookingEnd) OR
(b2.bookingStart < b1.bookingStart AND b2.bookingEnd > b1.bookingEnd)
) as booked SUM(lin1.qty)
FROM orders b1
LEFT JOIN order_lines lin1 ON b1.id=lin1.booking_id
LEFT JOIN products e ON e.id=lin1.product_id
(
(b1.bookingStart BETWEEN '$s' AND '$e') OR
(b1.bookingEnd BETWEEN '$s' AND '$e') OR
(b1.bookingStart < '$s' AND b1.bookingEnd > '$e')
)
GROUP BY b1.id,lin1.product_id
问题 如果我们的产品 x 库存为 10。
订单 1 已预订 3 个产品 x 订单 2 已预订 5 个产品 x 订单 3 已预订 8 个产品 x
下面的行表示预订的时间跨度
_ _ ___订单 1 x:3 _ __ _
_ __订单 2 x:5 _ __ _ _
_ __ _ __ _ ___订单 3 x:8 _ __ _ __
__订单 4 x:2 _
因此,只有当 3 个订单重叠时,产品 x 才实际超额预订,我不知道如何创建能够检测到该问题的查询。