我正在寻找很多例子,但我找不到答案。我需要做的是检查是否有新订单的可用空间。有一次,我可以拥有最多5个客户。订单持续时间不受限制,客户只需在选择器中选择日期时间范围。
例如我的DB记录是:
Cells(i, 1)
客户想要保留2017/06/11 08:00至2017/06/15 12:00,但我不能让他,因为这段时间与我的数据库中超过5条记录相吻合。我怎么能在mysql select query中做到这一点?
答案 0 :(得分:0)
尝试:
Select count(*)>5 as vacant
From orders
Where (input_start < end and input_start>start ) or
(Input_end > start and input start<start)
input
是您的搜索值
答案 1 :(得分:0)
您可以使用以下逻辑计算匹配记录的数量:
select count(*)
from t
where $start < end and $end > start;
这计算与($ start,$ end)重叠的记录数。您可以在应用程序中将比较设置为“5”。 (或者只使用select count(*) < 5
。
注意:您应该将值作为参数传递。
答案 2 :(得分:0)
试试likethis:
select id from table where id not in
/*the query below will get the wrong result */
(select id from table where yourstartdate between start and end or yourenddate between start and end);
答案 3 :(得分:0)
有许多许多解决方案。您已将其标记为PHP,因此可以在应用程序逻辑和存储中执行此操作。
您可以跨属性(由定义约束)而不是跨行(不受约束)分隔5个插槽。然后让应用程序决定事务是否可行(尽管您可以使用视图和触发器将其映射到单个每个记录的表示)。
正如其他人所建议的那样,您可以计算当前预订的时段数,以确定是否有可用性(但这需要至少完成两次,您需要避免竞争条件)。优选地,这将被实现为插入前触发器。
对此的替代方法或增强是向包含预留的表添加主/唯一键,包括枚举列(具有5个可能的值和非空约束),使得无法注入超过5条记录一个插槽。
但这完全是为了防止被认为不一致的国家。您的第一道防线是向用户提供不太可能导致此类冲突的选项。显而易见的情况是不提供已经有5次预订的插槽。