1

このコードを理解するのに助けを求めたいです... 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 に存在する必要があります。特定の日付と期間にすべての機器を取得するのとは逆に取得しようとしています。

論理:

  1. tbl_items, tbl_items_bulk(UNION) に現在存在するすべての機器の bcode を取得します。
  2. tbl_reservations に現在存在するすべての機器の bcode を取得し、番号 1 の UNION と一致するかどうかを確認します。
  3. 一致する場合は、resDate(予約日) を使用して結果をさらにフィルター処理します。**これにより、ユーザーが指定した resDate を持つすべての bcode が表示されるわけではありません。
  4. それでも一致する場合は、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;
4

3 に答える 3

3

わかりました、説明してみます。理解していただければ幸いです。

SELECT b.bcode                     // Selecting the bCode from tbl_items and tbl_items_bulk
    FROM (SELECT bcode FROM tbl_items
          UNION
          SELECT bcode FROM tbl_items_bulk
         ) b left outer join           // join to tbl_reservation where the bcode is equal and in
                                          a given timespan (USERTO  & USERFROM are 2 variables 
                                          passed from outside)
    tbl_reservation r
     on b.bcode = r.bcode and
        @USERTO <= r.ToDate and
        @USERFROM >= r.FromDate
WHERE r.bcode is null;            // and where your selected bcode is equal to null
于 2013-09-17T06:37:57.873 に答える
2

事実上、クエリはテーブルからのすべての bcode 値を表示しており、テーブルの bcode 列に一致するものはtbl_itemsありtbl_bulk_itemsませんtbl_reservations

このクエリは、次のようにするとより効率的に実行できます。

SELECT t.bcode 
FROM (
    SELECT bcode
    FROM tbl_items
    UNION
    SELECT bcode
    FROM tbl_items_bulk
) AS t
WHERE NOT EXISTS (
    SELECT *
    FROM tbl_reservation AS r
    WHERE r.bcode=t.bcode
        AND r.toDate>='20130916 07:00:00' AND r.fromDate<='20130916 22:00:00'
)
于 2013-09-17T07:45:38.060 に答える
0

on b.bcode = r.bcodeこのケースは例外であるため、このコードの結果は何もありませんWHERE r.bcode is null;

于 2013-09-17T06:31:24.727 に答える