我已经为此工作了几天,但我无法弄清楚。我希望你能帮助我。
我正在开发预订系统,我想检查 DATE 和 TIME 是否有可用的桌子。这就是我的数据库的样子。
我想将可用表放入选择下拉菜单中,因此在网站上它只显示可用表。
如果我使用以下查询,我可以获得储备表
SELECT res.reserveringsnr, datum, begintijd, eindtijd, tafr.tafelnr FROM reserveringen AS res
INNER JOIN tafels_regel AS tafr
ON res.reserveringsnr = tafr.reserveringsnr
WHERE (res.datum = "2013/12/18" AND (res.begintijd BETWEEN "12:00:00" and "14:00:00"))
因此,该查询将保留表排除在外,但这就是我卡住的地方。我不知道如何检查某个表是否在 DATE 和 TIME 上保留。
(注意:日期和时间将由变量填写,但对于示例我只使用文本)
编辑:处理@sebt 他的解决方案
首先,回答你的问题
- 预订总是在同一天
- 预订有固定的时间,总是 2 小时。
我已经编辑了 sebt 对我的价值观的查询:
SELECT t.* FROM
tafels t
LEFT JOIN
(SELECT tafelnr FROM
tafels_regel tf
INNER JOIN
reserveringen res
ON tf.reserveringsnr=res.reserveringsnr
WHERE
res.datum="2012/01/12" AND
res.begintijd<"19:00:00" AND
res.eindtijd>"21:00:00"
)
ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTime.tafelnr
WHERE ReservationsAtThisTime.tafelnr IS NULL
此查询输出以下结果
如您所见,查询结果显示所有 tafels (12)。
我还将表 reserveringen、tafels_regel 和 tafels 导出到 .csv(请参阅下面的已编辑 .csv)
编辑2:
好吧,我再次编辑了我的查询,它适用于一部分。这是查询(截图)
SELECT t.* FROM
tafels t
LEFT JOIN
(SELECT tafelnr FROM
tafels_regel tf
INNER JOIN
reserveringen res
ON tf.reserveringsnr=res.reserveringsnr
WHERE
res.datum="2013/01/12" AND
res.begintijd <= "19:00:00" AND
res.eindtijd >= "21:00:00"
)
ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTime.tafelnr
WHERE ReservationsAtThisTime.tafelnr IS NULL
2013/01/12 有 2 个预订。(下载编辑的.csv)
预约1:tafel 1 19:00-21:00
预订2:tafel 11 和 tafel 12 20:00 至 22:00
当我运行上面的查询时,唯一没有显示的 tafel 是 tafel 1,因为 tafel 1 是从 19:00 到 21:00 保留的。但是,从 20:00 到 22:00 tafel 11 和 12 也保留。
在查询结果中可以看到,只有 tafel 1 是 reserverd。但是,当我从 19:00 到 21:00 进行另一次预订时,我正在检查可用的 tafel,然后 tafel 11 和 tafel 12 仍然显示。
tafel 19:00 是免费的,没错,但因为我们总是坐 2 个小时,所以我们不能坐在那里。
再次感谢@sebt 的输入,希望您能通过此查询进一步帮助我!
问题解决了
感谢大家的帮助,这是最后的查询
SELECT t.* FROM
tafels t
LEFT JOIN
(SELECT tafelnr FROM
tafels_regel tf
INNER JOIN
reserveringen res
ON tf.reserveringsnr=res.reserveringsnr
WHERE
res.datum="2013/01/12" AND
res.eindtijd > "19:00:00" AND
res.begintijd < "21:00:00"
)
ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTime.tafelnr
WHERE ReservationsAtThisTime.tafelnr IS NULL