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(reservation date) 进一步过滤结果。**这将导致不显示具有用户指定的 resDate 的所有 bcode。
  4. 如果仍有匹配项,请使用 timeSTART 和 timeEND 进一步过滤结果。

意思是说,-如果 tbl_reservations 中存在设备 bcode,请不要显示它。- 如果 tbl_reservations 中存在设备 bcode,但没有用户指定的 resDate,则显示它。-如果tbl_reservations中存在设备bcode,具有用户将指定的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:00 至晚上 9:00(15 小时)内借用设备。

这是最新代码(timeFROM 和 timeTO 更改为 timeSTART 和 timeEND,因为我的系统每天不允许超过 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 值,并且在表tbl_itemstbl_bulk_itemsbcode 列中没有匹配项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 回答