编辑:戈登发布的查询似乎有问题.如果我从10-12预订,似乎认为所有预订都在12点以后无效,但所有预订在上午10点之前有效.
一些快速而简单的想法最终导致我创建以下查询:
SELECT serverip
FROM server
WHERE serverip NOT IN (SELECT serverip
FROM booking
WHERE startat >= datehere
AND expiresat <= datehere)
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
假设预订表存储以下内容:
+-----------+-----------+----------+----------+-----------+
| bookingid | serverip | username | startat | expiresat |
+-----------+-----------+----------+----------+-----------+
| 1 | 127.0.0.1 | testuser | 10:00 | 12:00 |
+-----------+-----------+----------+----------+-----------+
Run Code Online (Sandbox Code Playgroud)
如果用户要为预订输入以下数据:
startat = 9:59
expiresat = 12:01
Run Code Online (Sandbox Code Playgroud)
他们可以轻松绕过我的支票,看看预订时间是否可以根据之前的预订存储.
关于如何更好地解决这个问题的任何建议?
我宁愿不限制用户输入,并希望避免硬编码特定的时间段,如果这不是一个问题,但我会坚持我已经得到的.
谢谢你的时间.
您需要更改重叠的逻辑.试试这个:
SELECT serverip
FROM server
WHERE serverip NOT IN (SELECT serverip
FROM booking
WHERE startat <= USEREXPIREDATE AND
expiresat >= USERSTARTDATE
)
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
当插槽在所需用户到期日期之前开始并在所需用户开始日期之后结束时占用插槽.