查询:我不明白这段代码

时间:2013-09-17 06:27:59

标签: mysql sql select

我想请求帮助理解这段代码......我是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的所有bcodes。
  4. 如果仍有匹配项,请使用timeSTART和时间END进一步过滤结果。
  5. 意思是说, - 如果tbl_reservations中存在设备bcode,请勿显示它。 - 如果设备bcode存在于tbl_reservations中,但没有用户将指定的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和时间END,因为我的系统每天不允许超过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;
    

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

有效地,您的查询会显示表tbl_itemstbl_bulk_itemstbl_reservations表的bcode列中没有匹配项的所有bcode值。

这样的查询可以更有效地完成:

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'
)

答案 2 :(得分:0)

此代码的结果不算什么,因为此案例on b.bcode = r.bcodeWHERE r.bcode is null;的例外