2013-09-17 2 views
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. получить все оборудование bcode в настоящее время в tbl_items, tbl_items_bulk (UNION).
  2. получить все оборудование bcode, которое в настоящее время присутствует в tbl_reservations, и посмотреть, есть ли совпадения с UNION в номере 1.
  3. если есть совпадения, отфильтруйте результаты в дальнейшем, используя resDate (дата резервирования). ** это приводит к тому, что НЕ отображает все коды b, которые имеют resDate, указанный пользователем.
  4. Если есть еще совпадения, отфильтруйте результаты в дальнейшем с использованием времениSTART и времениEND.

Значение сказать, -оборудование bcode существует в tbl_reservations, НЕ ОТОБРАТЬ ЭТО. - если в tbl_reservations существует файл bcode, но он не имеет resDate, который пользователь укажет, а затем SHOW. - если в tbl_reservations имеется файл bcode, есть resDate, который пользователь укажет, но не имеет времени, на которое распространяется времяStart и timeEnd, затем SHOW IT.

Кажется, что мой код проверяет только дату. Я думал о чем-то, что проверяет даты и время, а также, как:

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, потому что моя система не позволяет более 15hours резервирования в день и не позволяет бронирование более чем на 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; 
+0

Что на самом деле вы не понимаете? 'UNION',' JOIN', вложенный запрос, пользовательские переменные '@ VAR'? – zerkms

+0

Цель @VAR в этом запросе - одна из вещей, которые я не понимаю. – user2784251

+1

Он находит все записи, которые присутствуют в таблице tbl_items, между двумя датами _USERTO и _USERFROM, вид объединения кажется избыточным –

ответ

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 
+0

Простите, мне все еще интересно, какая цель «WHERE r.bcode is null;» служить в моем коде .. – user2784251

+2

Он эффективно отфильтровывает что-либо с совпадениями в таблице tbl_reservation. Поскольку у вас есть левое соединение на b.code = r.code, любая строка с r.code = NULL означает, что в tbl_reservation не было соответствующей строки. –

+0

@RealityGone, путем фильтрации вы имели в виду, что он не отображает ничего, что соответствует совпадению в tbl_reservation? или мое предположение неверно? – user2784251

0

результатом этого кода является ничто, потому что этот случай on b.bcode = r.bcode является исключением WHERE r.bcode is null;

+1

Это левое внешнее соединение ... – Anton

+0

Что вы подразумеваете под «is except of WHERE r.bcode is null;»? Из vb.net исключения - это ошибки? Здесь одно и то же? – user2784251

+0

@ Антон, что вы подразумеваете под словом «Это левое внешнее соединение ...»? Я знаю, что такое левое внешнее соединение, но я не совсем уверен, что вы имели в виду ... – user2784251

2

Эффективно ваш запрос показывает вам все значения bcode из таблиц tbl_items и tbl_bulk_items, которые не имеют аналогов в колонке bcode из tbl_reservations таблицы.

Этот запрос можно было бы сделать более effeciently, как так:

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

Но что, если мне нужно проверить, имеются ли те bcodes, присутствующие в tbl_reservation, только для определенной даты и времени? (Например, 2013-09-16 с 7 утра до 10 утра)? – user2784251

+0

Вы должны добавить фильтрацию времени к подзапросу NOT EXISTS(). Таким образом, он проверяет только bcodes tbl_reservation для этого диапазона. (см. править) –

Смежные вопросы