Полусложный оператор выбора PHP / MySQL - PullRequest
3 голосов
/ 20 августа 2009

В настоящее время у меня есть 3 таблицы, которые я использую для людей, чтобы сделать бронирование для определенных единиц оборудования.

Вот мои таблицы:

tblEquipment:
     id        name        description
     1       Camera        Takes pictures
     2       Projector      Projects pictures
     3       Laptop         Portable Computer


tblEvents:
     id        start                 end              first_name         last_name              email
     1     2009-08-10      2009-08-11          John                 Doe                 jd@email.com
     2     2009-08-15      2009-08-16          Jane                 Doe                 jd@email.com


tblEventData:
     id         eventID             equipmentID
     1              1                         1             
     2              1                         2

Прямо сейчас пользователь отправит запрос с указанным временем, затем он увидит все доступное оборудование.

Итак, используя приведенный выше пример, если пользователь ищет оборудование между 8 / 10-8 / 11, он увидит, что единственным доступным оборудованием является: equipmentID 3 (Laptop).

Как я могу создать свой запрос для возврата только доступного оборудования на основе запрошенного времени?

Это то, что я придумал до сих пор, но не могу заставить его работать:

SELECT tblequipment.id as name, tblEvents.start as start, tblEvents.end as end
FROM tblEquipment
INNER JOIN tblEventData on tblEventData.equipmentID = tblEquipment.id
INNER JOIN tblEvents on tbleventdata.eventID = tblEvents.id
WHERE NOT EXISTS(SELECT * FROM tblEvents WHERE $end >= start AND $start <= end)

Есть идеи? Спасибо!

Ответы [ 3 ]

2 голосов
/ 20 августа 2009

В вашем запросе теперь есть NOT EXISTS, ищущий только событий , которые происходят между указанным временем начала и окончания. Другими словами, «выбирайте все оборудование, пока в этом периоде нет событий». Это не то, что вы хотите. Вы хотите: «выбрать все оборудование, если нет событий , использующих это оборудование в этот период».

Это означает что-то вроде:

SELECT tblequipment.id as name
FROM tblEquipment
WHERE NOT EXISTS 
  (SELECT * FROM tblEvents 
   INNER JOIN tblEventData ON (tblEvents.id = tblEventData.eventID)
   WHERE $end >= start AND $start <= end
   AND tblEventData.equipmentID = tblEquipment.id)

РЕДАКТИРОВАТЬ: Я также удалил JOIN s из внешнего запроса, поскольку они настаивают на том, чтобы вы выбирали только оборудование , которое зарезервировано в некоторый момент , что совсем не относится к вашему пытаюсь ответить.

Вы хотите знать, какое оборудование зарезервировано, но внутри запроса NOT EXISTS, чтобы исключить его из ваших окончательных результатов.

1 голос
/ 20 августа 2009

«конец» - зарезервированное слово в SQL. Попробуйте назвать tblEvents.end что-то еще.

1 голос
/ 20 августа 2009

Попробуйте поставить конец в кавычках, чтобы оно было

`end`

Я думаю, что mysql интерпретирует end как команду, а не поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...