【问题标题】:Semi-Complicated PHP/MySQL Select Statement半复杂的 PHP/MySQL Select 语句
【发布时间】:2009-08-19 23:37:32
【问题描述】:

我目前有 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 之间寻找设备,他将看到唯一可用的设备是:设备 ID 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)

有什么想法吗?谢谢!

【问题讨论】:

    标签: php mysql select


    【解决方案1】:

    您现在的查询有一个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)
    

    编辑:我还从外部查询中删除了JOINs,因为他们坚持只选择设备在某些时候保留,这与问题完全无关你正在尝试回答。

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

    【讨论】:

    • 感谢 VoteyDisciple 的回复,但是,我现在收到错误消息:“where 子句”中的未知列“tblEquipment.equipmentID”有什么想法吗?
    • 我误读了您的原始架构。确实没有该名称的列;您已将其命名为 tblEquipment.id — 我将进行适当的编辑以及另一项更改。
    • 最后一部分应该是 tblEventData.equipmentID = tblEquipment.id
    【解决方案2】:

    试着把结尾放在引号里,这样就可以了

    `结束`

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

    【讨论】:

      【解决方案3】:

      “end”是 SQL 中的保留字。尝试将 tblEvents.end 命名为其他名称。

      【讨论】:

      • 好点,谢谢。我继续将列名更改为 startTime 和 endTime。
      猜你喜欢
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2012-04-07
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多