半复杂的PHP / MySQL Select语句

时间:2009-08-19 23:37:32

标签: php mysql select

我目前有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(笔记本电脑)。

如何根据请求的时间创建查询以仅返回可用设备?

这是我到目前为止所提出的,但无法让它发挥作用:

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 个答案:

答案 0 :(得分:2)

您现在拥有的查询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,因为他们坚持只选择在某些时候保留的设备 ,这与你想要回答的问题。

您确实想知道在NOT EXISTS查询中保留了哪些设备,以便将其从最终结果中排除。

答案 1 :(得分:1)

尝试将结尾放在引号中,使其为

`end`

我认为mysql将end解释为命令而不是字段。

答案 2 :(得分:1)

“end”是SQL中的保留字。尝试命名tblEvents.end其他内容。