Php ty 10那么,你想得到所有介于DATE1和DATE2之间的订单,这些订单的产品超过了限额(product.stock),对吗?我尝试了一些类似的方法,但没有考虑重叠。我更新了问题的更多细节。它与我想要的非常接近,只是bookingStart和bookin
Php ty 10那么,你想得到所有介于DATE1和DATE2之间的订单,这些订单的产品超过了限额(product.stock),对吗?我尝试了一些类似的方法,但没有考虑重叠。我更新了问题的更多细节。它与我想要的非常接近,只是bookingStart和bookin,php,mysql,Php,Mysql,ty 10那么,你想得到所有介于DATE1和DATE2之间的订单,这些订单的产品超过了限额(product.stock),对吗?我尝试了一些类似的方法,但没有考虑重叠。我更新了问题的更多细节。它与我想要的非常接近,只是bookingStart和bookingEnd是一个日期时间,所以我需要找到超售发生的具体时间间隔。 id int bookingStart DATETIME bookingEnd DATETIME id int qty int product_id int booking_id
ty 10那么,你想得到所有介于
DATE1
和DATE2
之间的订单,这些订单的产品超过了限额(product.stock
),对吗?我尝试了一些类似的方法,但没有考虑重叠。我更新了问题的更多细节。它与我想要的非常接近,只是bookingStart和bookingEnd是一个日期时间,所以我需要找到超售发生的具体时间间隔。
id int
bookingStart DATETIME
bookingEnd DATETIME
id int
qty int
product_id int
booking_id int
id int
stock int
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
select p.id, p.stock, t.bookedQty
from products as p
inner join (
select ol.product_id, sum(ol.qty) as bookedQty
from order_lines as ol
inner join orders as o on ol.booking_id = o.id
where o.bookingStart between '2013-06-10' and '2013-06-11'
and t.bookedQty > p.stock
group by ol.product_id) as t
SELECT
date,
p.product_id,
sum(ol.qty) AS total_booked,
p.stock AS available
FROM (
SELECT c.date
FROM
(SELECT curdate() + interval (a.a + (10 * b.a)) DAY AS date
FROM
(SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS a CROSS
JOIN
(SELECT 0 AS a
UNION ALL SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9) AS b
) AS c
WHERE c.date >= curdate() AND c.date < DATE_ADD(curdate(), INTERVAL 100 DAY)
) AS gendates
INNER JOIN orders AS o ON o.bookingStart <= gendates.date AND o.bookingEnd > gendates.date
INNER JOIN order_lines AS ol ON o.order_id = ol.order_id
INNER JOIN products AS p ON ol.product_id = p.product_id
GROUP BY gendates.date, p.product_id, p.stock
HAVING total_booked > p.stock
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
stock INT
) ENGINE=InnoDB;
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
bookingStart DATETIME,
bookingEnd DATETIME
) ENGINE=InnoDB;
CREATE TABLE order_lines (
line_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
product_id INT,
qty INT NOT NULL DEFAULT 0,
CONSTRAINT FOREIGN KEY(order_id) REFERENCES orders(order_id) ON DELETE RESTRICT,
CONSTRAINT FOREIGN KEY(product_id) REFERENCES products(product_id) ON DELETE RESTRICT
) ENGINE=InnoDB;
INSERT INTO products(name, stock) VALUES('Product 1', 8);
INSERT INTO products(name, stock) VALUES('Product 2', 14);
INSERT INTO products(name, stock) VALUES('Product 3', 25);
INSERT INTO orders(bookingStart,bookingEnd) VALUES(NOW(), (NOW() + INTERVAL 2 HOUR));
INSERT INTO orders(bookingStart,bookingEnd) VALUES(NOW(), (NOW() + INTERVAL 3 HOUR));
INSERT INTO orders(bookingStart,bookingEnd) VALUES(NOW(), (NOW() + INTERVAL 4 HOUR));
INSERT INTO order_lines(order_id, product_id, qty) VALUES(1, 1, 2);
INSERT INTO order_lines(order_id, product_id, qty) VALUES(1, 1, 8);
INSERT INTO order_lines(order_id, product_id, qty) VALUES(2, 2, 5);
INSERT INTO order_lines(order_id, product_id, qty) VALUES(2, 2, 10);
INSERT INTO order_lines(order_id, product_id, qty) VALUES(3, 3, 2);
INSERT INTO order_lines(order_id, product_id, qty) VALUES(3, 3, 8);
INSERT INTO order_lines(order_id, product_id, qty) VALUES(3, 3, 10);
SELECT
products.*,
SUM(order_lines.qty) as sum_qty
FROM products
LEFT JOIN order_lines ON order_lines.product_id = products.product_id
LEFT JOIN orders ON orders.order_id = order_lines.order_id
WHERE orders.bookingStart >= '2013-06-12'
AND orders.bookingEnd <= '2013-06-14'
GROUP BY order_lines.order_id, order_lines.product_id
HAVING sum_qty > products.stock