MYSQL在DATE RANGE中选择MAX COUNT

时间:2017-06-21 11:22:10

标签: php mysql datetime count max

我正在寻找很多例子,但我找不到答案。我需要做的是检查是否有新订单的可用空间。有一次,我可以拥有最多5个客户。订单持续时间不受限制,客户只需在选择器中选择日期时间范围。

例如我的DB记录是:

Cells(i, 1)

客户想要保留2017/06/11 08:00至2017/06/15 12:00,但我不能让他,因为这段时间与我的数据库中超过5条记录相吻合。我怎么能在mysql select query中做到这一点?

4 个答案:

答案 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次预订的插槽。