このコードを理解するのに助けを求めたいです... mysql の初心者なので、このコードが何をするのかを読むのは難しいと思いました...
SELECT b.bcode
FROM (SELECT bcode FROM tbl_items
UNION
SELECT bcode FROM tbl_items_bulk
) b left outer join
tbl_reservation r
on b.bcode = r.bcode and
@USERTO <= r.ToDate and
@USERFROM >= r.FromDate
WHERE r.bcode is null;
誰かがこのコードが何をするかを理解するのを手伝ってくれますか? 前もって感謝します!
@Ashutosh Arya、日付と期間が予約されていないすべてのアイテムを取得しようとしていました。「予約済み」であることにより、機器は tbl_reservations に存在する必要があります。特定の日付と期間にすべての機器を取得するのとは逆に取得しようとしています。
論理:
- tbl_items, tbl_items_bulk(UNION) に現在存在するすべての機器の bcode を取得します。
- tbl_reservations に現在存在するすべての機器の bcode を取得し、番号 1 の UNION と一致するかどうかを確認します。
- 一致する場合は、resDate(予約日) を使用して結果をさらにフィルター処理します。**これにより、ユーザーが指定した resDate を持つすべての bcode が表示されるわけではありません。
- それでも一致する場合は、timeSTART と timeEND を使用して結果をさらにフィルタリングします。
つまり、-機器の bcode が tbl_reservations に存在する場合は、それを表示しないでください。-機器の bcode が tbl_reservations に存在するが、ユーザーが指定する resDate がない場合は、それを表示します。-機器の bcode が tbl_reservations に存在し、ユーザーが指定する resDate を持っているが、timeStart と timeEnd でカバーされる時間がない場合は、それを表示します。
私のコードは日付のみをチェックしているようです。次のように、日付と時刻もチェックするものを考えていました。
SELECT b.*
FROM (SELECT * FROM tbl_items
UNION
SELECT * FROM tbl_items_bulk
) b left outer join
tbl_test t
on b.bcode = t.bcode and
'2013-09-16' = t.resDate AND
'9:30' <= t.timeSTART AND
'7:00' >= t.timeEND
WHERE t.bcode is null;
また、私のシステムでは、機器を長期間借りることができません。7:00AM~9:00PM(15時間)を超えての貸出はできません。
こちらが最新のコードです (timeFROM と timeTO が timeSTART と timeEND に変更されました。これは、私のシステムでは 1 日 15 時間以上の予約が許可されておらず、1 日を超える予約も許可されていないためです):
SELECT b.*
FROM (SELECT * FROM tbl_items
UNION
SELECT * FROM tbl_items_bulk
) b left outer join
tbl_test t
on b.bcode = t.bcode and
NOT ('4:30' < t.timeSTART OR '7:00' > t.timeEND)
WHERE t.bcode is null;