私はクエリに少し苦労しており、純粋な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
問題 在庫数が 10 の製品 x があるとします。
注文 1 は 3 個の製品を予約しました x 注文 2 は 5 個の製品を予約しました x 注文 3 は 8 個の製品を予約しました x
以下の行は、予約された期間を示します
__ _ ___注文 1 x:3 _ __ _
_注文 2 x:5 _ __ _ _ __ _ _
_注文3 x:8 _ __ _ __注文4 x :2 _
そのため、3 つの注文が重複して製品 x が実際にオーバーブッキングされている場合にのみ、それを検出できるクエリを作成する方法がわかりません。