繁体   English   中英

MYSQL在DATE RANGE中选择MAX COUNT

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM