[英]MYSQL Select MAX COUNT in DATE RANGE
我一直在寻找许多示例,但找不到答案。 我需要做的是检查新订单是否有可用空间。 一次最多只能有5位客户。 订单持续时间不受限制,客户只需在选择器中选择日期时间范围即可。
例如,我的数据库记录是:
`id` `start` `end`
`1` `2017/06/10 10:00` `2017/06/15 08:00`
`2` `2017/06/11 10:00` `2017/06/16 08:00`
`3` `2017/06/12 10:00` `2017/06/17 08:00`
`4` `2017/06/13 10:00` `2017/06/18 08:00`
`5` `2017/06/14 10:00` `2017/06/19 08:00`
客户想从2017/06/11 08:00到2017/06/15 12:00进行预订,但是我不能让他预订,因为此时间段与我数据库中的5条以上记录一致。 我如何在mysql select查询中做到这一点?
尝试:
Select count(*)>5 as vacant
From orders
Where (input_start < end and input_start>start ) or
(Input_end > start and input start<start)
input
是您的搜索值
您可以使用以下逻辑对匹配记录的数量进行计数:
select count(*)
from t
where $start < end and $end > start;
这将计数与($ start,$ end)重叠的记录数。 您可以在应用程序中将比较结果设为“ 5”。 (或仅使用select count(*) < 5
。
注意:您应该将值作为参数传递。
尝试这样:
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);
有很多很多解决方案。 您已将其标记为PHP,因此在应用程序逻辑以及一个存储中可以进行此操作。
您可以将5个插槽跨属性(受定义约束)而不是跨行(不受约束)分隔。 然后,让应用程序确定事务是否可行(尽管您可以使用视图和触发器将其映射到单个按记录记录的插槽)。
正如其他人所建议的那样,您可以计算当前预订的插槽数,以确定是否有可用性(但这需要至少进行两次,并且需要避免出现竞争状况)。 优选地,这将被实现为插入前触发器。
对此的一种替代方法或增强功能是向包含保留的表添加主/唯一键,该保留包括枚举列(具有5个可能的值和一个非空约束),从而不可能为一个插槽注入超过5条记录。
但这全都在于防止被认为不一致的状态。 您的第一道防线是向用户提供不太可能引起此类冲突的选项。 明显的情况是不提供已经有5个预订的广告位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.